我是靠谱客的博主 整齐白云,这篇文章主要介绍Java并发编程实战--FutureTask,现在分享给大家,希望可以做个参考。

FutureTask也可以用作闭锁。(FutureTask实现了Future语义,表示一种抽象的可生成结果的计算。FutureTask表示的计算是通过Callable来实现的,相当于一种可生成结果的Runnable,并且可以处于以下3种状态:等待运行(Waiting to run),正在运行(Running)和运行完成(Completed)。”执行完成”表示计算的所有可能结束方式,包括正常结束、由于取消而结束和由于异常而结束等。当FutureTask进入完成状态后,它会停止在这个状态上。

Future.get的行为取决于任务的状态。如果任务已经完成,那么get会立即返回结果,否则get将阻塞直到任务进入完成状态,然后返回结果或者抛出异常。FutureTask将计算结果从执行计算的线程到获取这个结果的线程,而FutureTask的规范确保了这种传递过程能实现结果的安全发布。

FutureTask在Executor框架中表示异步任务,此外还可以用来表示一些时间较长的计算,这些计算可以在使用计算结果之前启动。

复制代码
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
31
32
33
34
35
36
37
38
39
40
41
public class Preloader { ProductInfo loadProductInfo() throws DataLoadException, InterruptedException { System.out.println("loadProductInfo start"); Thread.sleep(1000 * 10); System.out.println("loadProductInfo end"); return null; } private final FutureTask<ProductInfo> future = new FutureTask<>(() -> loadProductInfo()); private final Thread thread = new Thread(future); public void start() { thread.start(); System.out.println("start"); } public ProductInfo get() throws DataLoadException, InterruptedException { try { System.out.println("get start"); ProductInfo per = future.get(); System.out.println("get end"); return per; } catch (ExecutionException e) { Throwable cause = e.getCause(); if (cause instanceof DataLoadException) throw (DataLoadException) cause; else { // throw LaunderThrowable.launderThrowable(cause); return null; } } } interface ProductInfo { } } class DataLoadException extends Exception { }

Preloader创建了一个FutureTask,其中包含从数据库加载产品信息的任务,以及一个执行运算的线程。由于在构造函数或静态初始化方法中启动线程并不是一种好方法,因此提供了一个start方法来启动线程。当程序虽有需要ProductInfo时,可以调用get方法,如果数据已经加载,那么将返回这些数据,否则将等待加载完成后再返回。

Callable表示的任务可以抛出受检查的或未受检查的异常,并且任何代码都可能抛出一个Error。无论任务代码抛出什么异常,都会被封装到一个ExecutionException中,并在Future.get中被重新抛出。这将使调用get的代码变得复杂,因为它不仅需要处理可能出现的ExecutionException(以及未检查的CancellationException),而且还由于ExecutionException是作为一个Throwable类返回的,因此处理起来并不容易。

复制代码
1
2
3
4
5
6
7
8
9
10
Preloader preloader=new Preloader(); preloader.start(); preloader.get(); 输出 start get start loadProductInfo start loadProductInfo end get end

java并发编程实战pdf及案例源码下载:
http://download.csdn.net/detail/xunzaosiyecao/9851028

作者:jiankunking 出处:http://blog.csdn.net/jiankunking

最后

以上就是整齐白云最近收集整理的关于Java并发编程实战--FutureTask的全部内容,更多相关Java并发编程实战--FutureTask内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(117)

评论列表共有 0 条评论

立即
投稿
返回
顶部