Java异步调用1

在我们对 Scala 的使用过程之中.我们会频繁的用到一类方法,称为异步方法.
在 Scala 中也是我们最熟悉的 scala.concurrent.Future.不了解相关内容的可以去看 Future 相关的博客.

通过对 Future 方法的调用,我们可以特别优雅的方式实现异步的调用.也就是类似多线程的使用.

在 Java 中,代码大部分都是同步执行的.简单的来说,就是做一顿饭我先刷锅,再淘米.等米饭做熟了再去洗碗洗菜炒菜盛饭盛菜摆桌吃饭.

有了异步方法,我们就可以做到先刷锅刷碗,在淘米做饭的空闲功夫去洗菜炒菜做饭.大大节省我们的程序的运行效率.

FutureTaskFuture接口的一个实现类,它是从 Java 1.5 开始引入的.通过它能够控制它的执行方法的行为.其具体的内容是通过 Callable接口来实现的.

FutureTask有7个状态,其中数值从小到大:
NEW COMPLETING NORMAL EXCEPTIONAL CANCELLED INTERRUPTING INTERRUPTED
其中,状态有几个可能的流转方式:

  1. 新建 -> 完成中 -> 普通
  2. 新建 -> 完成中 -> 异常
  3. 新建 -> 取消
  4. 新建 -> 打断中 -> 打断

FutureTask 有许多方法,包括:

  • isCancelled 方法 : 返回是否取消(当状态是后面三种情况时)
  • isDone 方法 : 返回是否处理(当状态不是新建时)
  • cancel 方法 : 试图取消方法(状态可能变成取消或者被打断)
  • get 方法 : 获取到方法的返回值,如果传入了时间并且超时的话会抛出异常

FutureTask的构造器传入一个 Callable 对象,它和 Runnable 的主要区别是:

Callable Runnable
实现 call 方法 实现 run 方法
可获得返回结果 不能直接获得结果
可以抛出异常 不能抛出异常

接下来我们直接看代码实现;

首先我有五个获取对应的信息的方法getGeneral.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

ExecutorService executorService = Executors.newFixedThreadPool(5);

//分别建立了对应的五个异步对象

FutureTask<JSONObject> generalA = getGeneral(receiver, MessageType.A);

FutureTask<JSONObject> generalB = getGeneral(receiver, MessageType.B);

FutureTask<JSONObject> generalC = getGeneral(receiver, MessageType.C);

FutureTask<JSONObject> generalD = getGeneral(receiver, MessageType.D);

FutureTask<JSONObject> generalE = getGeneral(receiver, MessageType.E);

//对五个异步对象进行执行

executorService.execute(generalA);

executorService.execute(generalB);

executorService.execute(generalC);

executorService.execute(generalD);

executorService.execute(generalE);

//获取到五个对应的异步结果,时间取决于最慢的一个异步方法

try {

response.put("a_result", generalA.get());

response.put("b_result", generalB.get());

response.put("c_result", generalC.get());

response.put("d_result", generalD.get());

response.put("e_result", generalE.get());

return response;

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

} finally {

//在所有结束情形下关闭线程池,回收资源

executorService.shutdown();

}

下面是getGeneral的代码:

1

2

3

4

5

6

7

8

9
private FutureTask<JSONObject> (String receiver, MessageType messageType) {

return new FutureTask<JSONObject>(new Callable<JSONObject>() {

public JSONObject call() throws Exception {

//Do Something ....

return messageJson;

}

});

}

这样就完成了我们的五组异步调用.



异步方面我暂且也学到这里,将来有机会继续更新有关异步的内容.

原文:大专栏  Java异步调用1

原文地址:https://www.cnblogs.com/petewell/p/11615063.html

时间: 2024-11-09 04:45:37

Java异步调用1的相关文章

java 异步调用与多线程

异步与多线程的区别 一.异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾自的处理它自己的事儿,不用干等着这个耗时操作返回..Net中的这种异步编程模型,就简化了多线程编程,我们甚至都不 用去关心Thread类,就可以做一个异步操作出来. 二.随着拥有多个硬线程CPU(超线程.双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论.本文主要是想探讨一下如

Java异步调用转同步的5种方式

1.异步和同步的概念 同步调用:调用方在调用过程中,持续等待返回结果. 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数. 2 .异步转为同步的概率 需要在异步调用过程中,持续阻塞至获得调用结果. 3.异步调用转同步的5种方式 1.使用wait和notify方法 2.使用条件锁 3.Future 4.使用CountDownLatch 5.使用CyclicBarrier 4.构造一个异步调用模型. 我们主要关心call方法,这个方法接收了一个demo参

利用回调实现Java的异步调用

异步是指调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通知调用者,或通过回调函数处理这个调用. 回调简单地说就是B中有一个A,这样A在调用B的某个方法时实际上是调用到了自己的方法. 利用回调可以实现Java的异步调用,下面的例子来自网上. 回调接口: public interface CallBack { /** * 执行回调方法 * @param objects 将处理后的结果作为参数返回给回调方法 */ public void execute(Object... object

java实现异步调用实例

在JAVA平台,实现异步调用的角色有如下三个角色: 调用者 取货凭证   真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据. 所以连结调用者和真实数据之间的桥梁是取货凭证.我们先来看它的实现: public class FutureTicket{ private Object data = null; private boolean completed = false;  public synchronized void m

从Java future 到 Guava ListenableFuture实现异步调用

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51232004 前言 随着移动互联网的蓬勃发展,手机App层出不穷,其业务也随之变得错综复杂.针对于开发人员来说,可能之前的一个业务只需要调取一次第三方接口以获取数据,而如今随着需求的增加,该业务需调取多个不同的第三方接口.通常,我们处理方法是让代码同步顺序的去调取这些接口.显然,调取接口数量的增加必然会造成响应时间的增加,势必会对系统性能造成一定影响. 为

java future模式 所线程实现异步调用(转载

java future模式 所线程实现异步调用(转载) 在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决.Future顾名思意,有点像期货市场的“期权”,是“对未来的一种凭证”,例如当我们买了某个房地产开发商的期房,交钱之后,开发商会给我们一个凭证(期权),这个凭证告诉我们等明年某个时候拿这个凭证就可以拿到我们所需要的房子,但是现在房子还没建好.市场上之所以有“期货”,也正由于有这种需求,才有这种供给. 这种应用在GUI上用的比较多,在设

java三种调用方式(同步调用/回调/异步调用)

1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口 ) 实例2:老师平时学生布置任务后不可能一直等待和监督学生完成,老师通常会告诉学生,任务完成后给他打个电话或者发个信息,那么学生给老师返回结果的过程需要老师信息,这就是一个回调的过程.

CXF简单示例(二)之异步调用

在实际使用中,客户端在调用服务时,并不能及时得到响应,比如调用的服务本身是一个耗时费事的活,服务器破死命的跑,也只能在一分钟后才能够返回结果,这时候如果是同步的情况,那么客户端就必须在这里到等上一分钟,啥事不干.这肯定是不能容忍的,光吃饭不干活,再有这么好的事,请告诉我! OK,所以我们需要异步调用. 在这里,先介绍CXF提供的一个工具:WSDL2Java. 我们可以方便的利用它来生成相应的客户端接口,配置什么的脏活累活它都给我们干了,而我们只需要这样直接用就行了. 1. 获得服务的WSDL路径

Axis2发布webservice(4)&mdash;webservice的异步调用

一,发布一个webservice,代码如下 package com.hoo.service; public class AsynchronousService { public String execute() throws InterruptedException{ //让当前线程睡眠5钟,展示异步调用 Thread.sleep(5000); return "done"; } } 二.发布Service,参见前面教程,不多讲 三.RPC方式异步调用: import java.io.I