Runnable、Callable、Executor、Future、FutureTask关系解读
Future 介紹
Future表示異步計(jì)算的結(jié)果,它提供了檢查計(jì)算是否完成的方法,以等待計(jì)算的完成,并檢索計(jì)算的結(jié)果。Future的cancel方法可以取消任務(wù)的執(zhí)行,它有一布爾參數(shù),參數(shù)為 true 表示立即中斷任務(wù)的執(zhí)行,參數(shù)為 false 表示允許正在運(yùn)行的任務(wù)運(yùn)行完成。Future的 get 方法等待計(jì)算完成,獲取計(jì)算結(jié)果
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
?* Callable 和 Future接口
?* Callable是類似于Runnable的接口,實(shí)現(xiàn)Callable接口的類和實(shí)現(xiàn)Runnable的類都是可被其它線程執(zhí)行的任務(wù)。
?* Callable和Runnable有幾點(diǎn)不同:
?* (1)Callable規(guī)定的方法是call(),而Runnable規(guī)定的方法是run().
?* (2)Callable的任務(wù)執(zhí)行后可返回值,而Runnable的任務(wù)是不能返回值的。
?* (3)call()方法可拋出異常,而run()方法是不能拋出異常的。
?* (4)運(yùn)行Callable任務(wù)可拿到一個(gè)Future對象,
?* Future 表示異步計(jì)算的結(jié)果。它提供了檢查計(jì)算是否完成的方法,以等待計(jì)算的完成,并檢索計(jì)算的結(jié)果。
?* 通過Future對象可了解任務(wù)執(zhí)行情況,可取消任務(wù)的執(zhí)行,還可獲取任務(wù)執(zhí)行的結(jié)果。
?*/
?
在再度溫習(xí)Java5的并發(fā)編程的知識(shí)點(diǎn)時(shí)發(fā)現(xiàn),首要的就是把Runnable、Callable、Executor、Future等的關(guān)系搞明白,遂有了下述小測試程序,通過這個(gè)例子上述三者的關(guān)系就一目了然了。
在java5以后,一個(gè)可以調(diào)度執(zhí)行的線程單元可以有三種方式定義:
Thread、Runnable、Callable,其中Runnable實(shí)現(xiàn)的是void run()方法,Callable實(shí)現(xiàn)的是 V call()方法,并且可以返回執(zhí)行結(jié)果,其中Runnable可以提交給Thread來包裝下,直接啟動(dòng)一個(gè)線程來執(zhí)行,而Callable則一般都是提交給ExecuteService來執(zhí)行。
簡單來說,Executor就是Runnable和Callable的調(diào)度容器,Future就是對于具體的調(diào)度任務(wù)的執(zhí)行結(jié)果進(jìn)行查看,最為關(guān)鍵的是Future可以檢查對應(yīng)的任務(wù)是否已經(jīng)完成,也可以阻塞在get方法上一直等待任務(wù)返回結(jié)果。Runnable和Callable的差別就是Runnable是沒有結(jié)果可以返回的,就算是通過Future也看不到任務(wù)調(diào)度的結(jié)果的。?
[java]?view plaincopy執(zhí)行結(jié)果如下:
[plain]?view plaincopyFutureTask則是一個(gè)RunnableFuture<V>,即實(shí)現(xiàn)了Runnbale又實(shí)現(xiàn)了Futrue<V>這兩個(gè)接口,另外它還可以包裝Runnable和Callable<V>,所以一般來講是一個(gè)符合體了,它可以通過Thread包裝來直接執(zhí)行,也可以提交給ExecuteService來執(zhí)行,并且還可以通過v get()返回執(zhí)行結(jié)果,在線程體沒有執(zhí)行完成的時(shí)候,主線程一直阻塞等待,執(zhí)行完則直接返回結(jié)果。
?
[java]?view plaincopy執(zhí)行結(jié)果如下:
?
?
?
[java]?view plaincopy?
總結(jié)
以上是生活随笔為你收集整理的Runnable、Callable、Executor、Future、FutureTask关系解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python控制1602液晶屏实时显
- 下一篇: DNS入门介绍之三BIND安装配置全过程