再回首Java第二十四天

Callable和Future
Java1.5开始,Java提供了Callable接口,Callable接口提供了一个call()方法作为线程的执行体,但call()方法run()方法的功能更强大:
call()方法可以有返回值
call()方法可以声明抛出异常
因此我们完全可以提供一个Callable对象作为Thread的target,而该线程的执行体就是该Callable对象的call方法。问题是:Callable对象时JDK1.5开始新增的接口,而它并不是Runnable的子接口,所以Callable对象不能直接作为Thread的target,而且call方法有个返回值 ,call方法并不是直接调用,它是作为线程的执行体调用。那么如何获得call方法的返回值呢?
JDK1.5开始提供了一个Future接口来代表call方法的返回值,并未Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口就可以Thread类的target接口了
Callable接口又泛型限制,Callable接口里的泛型形参类型与call方法的返回类型相同
在Future接口里定义了如下几个公共方法来控制它关联的Callable任务
boolean cancel(boolean mayInterruptIfRunning):试图取消Future关联的Callable任务
V get():返回Callable任务里call方法的返回值。调用该方法将导致程序阻塞必须等到,子线程结束时才会得到返回值
V get(long timeout,TimeUnit unit):返回Callable任务里call方法的返回值,程序最多阻塞timeout和unit指定的时间,如果经过指定时间后还没有返回值就抛出TimeOutException
boolean isCancelled():如果Callable任务正常完成前被取消则返回true
boolean isDone():Callable任务完成则返回true
创建并启动有返回值的线程的步骤如下
1)创建Callable接口的实现类,实现call()方法,该call()方法作为线程的执行体,且该call()方法有返回值
2)创建Callable实现了的实例,使用FutureTask类来包装Callable对象,该FutureTask对象还封装了该Callable对象call()方法的返回值
3)使用FutureTask对象作为Thread实例的target创建并启动线程
4)调用FutureTask对象的方法来获得子线程结束后的返回值

posted @ 2016-05-09 23:55  刀口一人  阅读(110)  评论(0编辑  收藏  举报