FutureTask
实现了 RunnableFuture
这个接口,RunnableFuture
这个接口继承了Runnable
和Future
这两个接口

由于实现了
Future
这个接口,所以具有了Future
的cancel等特性,由于实现了Runnable
这个接口,所以可以将FutureTask
交给Executor
执行,在Executor
框架中,一个FutureTask
代表一个异步任务。FutureTask
有以下几种状态NEW,COMPLETING,NORMAL,EXCEPTIONAL,CANCELLED,INTERRUPTING,INTERRUPTED
可能的状态变化
- NEW -> COMPLETING -> NORMAL
- NEW -> COMPLETING -> EXCEPTIONAL
- NEW -> CANCELLED
- NEW -> INTERRUPTING -> INTERRUPTED
状态在进入最终状态后不可变,
当调用FutureTask#get()
时,线程会阻塞直至状态达到最终状态,若最终状态为NORMAL,则正常返回,若状态为CANCELLED或INTERRUPTED,则抛出CancellationException,若状态为EXCEPTIONAL,则抛出对应的执行异常
若状态已决议,则直接返回保存的值,过程与上文一致
网友评论