日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Runnable、Callable、Executor、Future、FutureTask关系解读

發布時間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • /**?
  • ?*?通過簡單的測試程序來試驗Runnable、Callable通過Executor來調度的時候與Future的關系?
  • ?*/??
  • package?com.hadoop.thread;??
  • ??
  • import?java.util.concurrent.Callable;??
  • import?java.util.concurrent.ExecutorService;??
  • import?java.util.concurrent.Executors;??
  • import?java.util.concurrent.Future;??
  • ??
  • public?class?RunnableAndCallable2Future?{??
  • ??
  • ????public?static?void?main(String[]?args)?{??
  • ??
  • ????????//?創建一個執行任務的服務??
  • ????????ExecutorService?executor?=?Executors.newFixedThreadPool(3);??
  • ????????try?{??
  • ????????????//1.Runnable通過Future返回結果為空??
  • ????????????//創建一個Runnable,來調度,等待任務執行完畢,取得返回結果??
  • ????????????Future<?>?runnable1?=?executor.submit(new?Runnable()?{??
  • ????????????????@Override??
  • ????????????????public?void?run()?{??
  • ????????????????????System.out.println("runnable1?running.");??
  • ????????????????}??
  • ????????????});??
  • ????????????System.out.println("Runnable1:"?+?runnable1.get());??
  • ??
  • ????????????//?2.Callable通過Future能返回結果??
  • ????????????//提交并執行任務,任務啟動時返回了一個?Future對象,??
  • ????????????//?如果想得到任務執行的結果或者是異常可對這個Future對象進行操作??
  • ????????????Future<String>?future1?=?executor.submit(new?Callable<String>()?{??
  • ????????????????@Override??
  • ????????????????public?String?call()?throws?Exception?{??
  • ????????????????????//?TODO?Auto-generated?method?stub??
  • ????????????????????return?"result=task1";??
  • ????????????????}??
  • ????????????});??
  • ????????????//?獲得任務的結果,如果調用get方法,當前線程會等待任務執行完畢后才往下執行??
  • ????????????System.out.println("task1:?"?+?future1.get());??
  • ??
  • ????????????//3.?對Callable調用cancel可以對對該任務進行中斷??
  • ????????????//提交并執行任務,任務啟動時返回了一個?Future對象,??
  • ????????????//?如果想得到任務執行的結果或者是異常可對這個Future對象進行操作??
  • ????????????Future<String>?future2?=?executor.submit(new?Callable<String>()?{??
  • ????????????????@Override??
  • ????????????????public?String?call()?throws?Exception?{???????????????
  • ????????????????????try?{??
  • ????????????????????????while?(true)?{??
  • ????????????????????????????System.out.println("task2?running.");??
  • ????????????????????????????Thread.sleep(50);??
  • ????????????????????????}??
  • ????????????????????}?catch?(InterruptedException?e)?{??
  • ????????????????????????System.out.println("Interrupted?task2.");??
  • ????????????????????}??
  • ????????????????????return?"task2=false";??
  • ????????????????}??
  • ????????????});??
  • ??????????????
  • ????????????//?等待5秒后,再停止第二個任務。因為第二個任務進行的是無限循環??
  • ????????????Thread.sleep(10);??
  • ????????????System.out.println("task2?cancel:?"?+?future2.cancel(true));??
  • ??
  • ????????????//?4.用Callable時拋出異常則Future什么也取不到了??
  • ????????????//?獲取第三個任務的輸出,因為執行第三個任務會引起異常??
  • ????????????//?所以下面的語句將引起異常的拋出??
  • ????????????Future<String>?future3?=?executor.submit(new?Callable<String>()?{??
  • ??
  • ????????????????@Override??
  • ????????????????public?String?call()?throws?Exception?{??
  • ????????????????????throw?new?Exception("task3?throw?exception!");??
  • ????????????????}??
  • ??
  • ????????????});??
  • ????????????System.out.println("task3:?"?+?future3.get());??
  • ????????}?catch?(Exception?e)?{??
  • ????????????System.out.println(e.toString());??
  • ????????}??
  • ????????//?停止任務執行服務??
  • ????????executor.shutdownNow();??
  • ????}??
  • }??
  • 執行結果如下:

    [plain]?view plaincopy
  • runnable1?running.??
  • Runnable1:null??
  • task1:?result=task1??
  • task2?running.??
  • task2?cancel:?true??
  • Interrupted?task2.??
  • java.util.concurrent.ExecutionException:?java.lang.Exception:?Bad?flag?value!??
  • FutureTask則是一個RunnableFuture<V>,即實現了Runnbale又實現了Futrue<V>這兩個接口,另外它還可以包裝Runnable和Callable<V>,所以一般來講是一個符合體了,它可以通過Thread包裝來直接執行,也可以提交給ExecuteService來執行,并且還可以通過v get()返回執行結果,在線程體沒有執行完成的時候,主線程一直阻塞等待,執行完則直接返回結果。

    ?

    [java]?view plaincopy
  • public?class?FutureTaskTest?{??
  • ??
  • ????/**?
  • ?????*?@param?args?
  • ?????*/??
  • ????public?static?void?main(String[]?args)?{??
  • ????????Callable<String>?task?=?new?Callable<String>()?{??
  • ????????????public?String?call()?{??
  • ????????????????System.out.println("Sleep?start.");??
  • ????????????????try?{??
  • ????????????????????Thread.sleep(1000?*?10);??
  • ????????????????}?catch?(InterruptedException?e)?{??
  • ????????????????????//?TODO?Auto-generated?catch?block??
  • ????????????????????e.printStackTrace();??
  • ????????????????}??
  • ????????????????System.out.println("Sleep?end.");??
  • ????????????????return?"time="?+?System.currentTimeMillis();??
  • ????????????}??
  • ????????};??
  • ??????????
  • ????????//直接使用Thread的方式執行??
  • ????????FutureTask<String>?ft?=?new?FutureTask<String>(task);??
  • ????????Thread?t?=?new?Thread(ft);??
  • ????????t.start();??
  • ????????try?{??
  • ????????????System.out.println("waiting?execute?result");??
  • ????????????System.out.println("result?=?"?+?ft.get());??
  • ????????}?catch?(InterruptedException?e)?{??
  • ????????????//?TODO?Auto-generated?catch?block??
  • ????????????e.printStackTrace();??
  • ????????}?catch?(ExecutionException?e)?{??
  • ????????????//?TODO?Auto-generated?catch?block??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ??????????
  • ????????//使用Executors來執行??
  • ????????System.out.println("=========");??
  • ????????FutureTask<String>?ft2?=?new?FutureTask<String>(task);??
  • ????????Executors.newSingleThreadExecutor().submit(ft2);??
  • ????????try?{??
  • ????????????System.out.println("waiting?execute?result");??
  • ????????????System.out.println("result?=?"?+?ft2.get());??
  • ????????}?catch?(InterruptedException?e)?{??
  • ????????????//?TODO?Auto-generated?catch?block??
  • ????????????e.printStackTrace();??
  • ????????}?catch?(ExecutionException?e)?{??
  • ????????????//?TODO?Auto-generated?catch?block??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ??????????
  • ????}??
  • }??

  • 執行結果如下:

    ?

    ?

    ?

    [java]?view plaincopy
  • waiting?execute?result??
  • Sleep?start.??
  • Sleep?end.??
  • result?=?time=1370844662537??
  • =========??
  • waiting?execute?result??
  • Sleep?start.??
  • Sleep?end.??
  • result?=?time=1370844672542??

  • ?

    總結

    以上是生活随笔為你收集整理的Runnable、Callable、Executor、Future、FutureTask关系解读的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 天天欲色| 欧美色婷婷 | aaa级片 | 伊人春色在线观看 | 亚洲啊v在线 | 国产在线一区不卡 | 国产精品老牛影院99av | 天天舔日日操 | 殴美一级黄色片 | yy4138理论片动漫理论片 | 成人听书哪个软件好 | www,日韩| av导航在线 | 日韩欧美中文字幕一区二区三区 | 干美女av| 草草影院在线观看 | 欧美视频xxx | 欧美性视频一区二区 | 国产免费一区二区三区在线播放 | 91香蕉一区二区三区在线观看 | www.欧美激情 | 国产aaaaaaa| 色老板精品凹凸在线视频观看 | 99久久久国产精品 | 免费国产一区二区 | 欧美亚洲一级片 | 久久综合一区二区 | 国产成人精品一区二区三区免费 | 热播网| 人妻与黑人一区二区三区 | 香蕉视频在线视频 | 性免费视频| 亚洲狠狠操 | 日本黄色小网站 | 射在线| 成人亚洲区 | 67194国产| 亚洲色图综合在线 | 天堂亚洲 | 色网在线视频 | 99综合视频 | 极品美女高潮出白浆 | 成人免费视频视频 | jjzz日本视频 | 免费看黄色的视频 | 久久久久久国产精品免费免费 | 国产精品爽爽久久 | 亚洲小视频在线观看 | 久草手机在线观看 | 极品超粉嫩尤物69xx | 欧美一区二区最爽乱淫视频免费看 | 亚洲一区二区三区四区在线 | 日本妈妈9| jizz欧美性23 | 国产成人在线视频播放 | 国产一级黄| 97人人人| 裸体裸乳免费看 | 美女毛毛片 | 亚洲色图3p| 亚洲天堂免费观看 | 红桃成人在线 | 亚洲欧美综合在线观看 | 日韩一区二区三区在线播放 | 欧美成人手机视频 | 国产精品色 | 国产免费黄色网址 | 久久逼逼 | 蜜桃成熟时李丽珍在线观看 | 欧美一区二区三区视频在线 | 狠狠人妻久久久久久综合麻豆 | 99热香蕉| 97在线精品 | 国内精品久久久久 | 欧美少妇18p | 吞精囗交69激情欧美 | 中文字幕 自拍偷拍 | 猛1被调教成公厕尿便失禁网站 | 天天夜夜草 | 黄色电影在线视频 | 黄网站色视频 | 免费看美女隐私网站 | jizz在线免费观看 | 欧美偷拍精品 | 开心激情网五月天 | 久久黄网 | www.白浆 | 一区二区午夜 | 日韩一级理论片 | exo妈妈mv在线播放高清免费 | 99久久久 | 免费观看成人毛片 | 欧美成人免费视频 | 欧美日韩在线视频免费观看 | 久久青草免费视频 | 久久高清内射无套 | 成人福利片 | 成年人视频在线免费观看 | 日韩在线观看免费网站 |