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