Java异步调用1

Posted petewell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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


以上是关于Java异步调用1的主要内容,如果未能解决你的问题,请参考以下文章

Java异步调用1

我应该在 Fragment 中的啥生命周期状态下执行异步任务?

关于其活动的片段生命周期

在哪里以及如何使用片段填充我的标签

java队列实现异步执行

如何延迟或异步此 WordPress javascript 片段以最后加载以加快页面加载时间?