Future、Callable、FutureTask详解

首先,要知道这三个类或者接口都是啥意思,用来干吗的。
Future:A represents the result of an asynchronous computation. 一个异步计算的结果的表示。就是用来得到结果的。并且提供了isDone和isCancelled方法判断线程是否已经完成和取消。并且提供了cancel方法打断线程(后面会讲解适用范围)。

Callable:A task that returns a result and may throw an exception. 只包含一个call方法。可以和Runnable进行类比(Runnable只包含一个run方法)。

FutureTask: Future和Callable只是两个接口,而FutureTask就是真正的实现了。它实现了Runnable接口和Future接口,并且内部包含一个Callable对象。

下面重点说这个FutureTask的源码。因为它是Runnable和Future的实现并且内部最主要的属性是一个Callable对象,研究它的源码就可以更加明白上述两个接口的含义。
①首先看它的构造方法,一个是传一个Callable,一个是传一个Runnable和Result,再跟进,发现这两个构造函数是一样的,后者调用了一个方法生成了一个Callable,所以说Callable可以理解为方法带返回结果的Runnable。
②再看实现了Runnable的run方法,可以看到主代码是 result = c.call()。也就是说在run方法中,直接调用了Callable的call方法。
③再看它实现的Future的所有接口:
- cancel方法:直接调用了t.interrupt()。所以,FutureTask的cancel是直接用Thread的interrupt方法的,所以要注意很多情况是停止不了线程运行的。目前已知的能打断的情况包括:wait、sleep、阻塞集合的put take。目前已知的不能打断的情况包括:正常运行的没有阻塞的方法(比如for循环)、io阻塞、等待syncronized锁的阻塞。也就是说,其实大多数的情况是cancel不掉的。这点要注意了。
- isCancelled:根据state状态判断是否已经cancel掉了。
- isDone:根据state状态是否已经运行完毕。
- get:逻辑很复杂,暂时没理解透。方法的意思是等待当前线程执行完毕并且取到方法运行结果。
以上就是FutureTask实现的5个所有的Runnable和Future的方法。具体的实现用到了大量java 5的concurrent包的类和思想,很难理解,暂时搁浅待以后慢慢探索。

下面总结一下FutureTask。
首先它是一个Runnable,所以可以用Thread t=new Thread(FutureTask); t.start();来启动一个线程。(就像普通Runnable一样)。
其次它是一个Future,实现了上面说到的Future接口的实现。提供了get方法取得计算结果,提供了cancel方法interrupt线程,并且提供了isCanceled和isDone判断线程的状态。
其次它构造方法里必须直接或间接生成一个Callable对象,在run方法中调用了Callable的call方法,执行call方法的逻辑并且通过call方法的返回值实现Future得到处理结果的目的。

Future、Callable和Future很多人包括我在平时编程中不怎么用,这是因为平时开线程一般是去联网,而联网的结果一般是自己写回调的,不需要Future去得到回调结果。而且FutureTask提供的cancel方法并不能打断阻塞在io的线程,而且这种联网线程的一般会通过设置超时时间去处理。但是知道这三个类对阅读源码还是很有帮助的。比如AsyncTask的源码。

谢谢阅读~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值