日韩性视频-久久久蜜桃-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关系解读的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 91国产中文字幕 | 色小姐在线视频 | 天天干天天舔天天操 | 色鬼综合| 久久久久美女 | 久久99精品国产麻豆婷婷 | 日本黄色视屏 | 亚洲综合在线一区 | 海角社区登录 | 青青久久av| 国产欧美激情视频 | 国产欧美一区二区三区沐欲 | 亚洲宅男天堂 | 少妇被按摩师摸高潮了 | 风流僵尸艳片a级 | 抱着老师的嫩臀猛然挺进视频 | 国产999久久久 | 闺蜜张开腿让我爽了一夜 | 男人的天堂狠狠干 | 欧美日韩激情 | 亚洲欧洲在线视频 | 天天添天天操 | 久久噜噜噜精品国产亚洲综合 | 国产欧美一级片 | 欧美福利在线观看 | 欧美爽妇| 风韵丰满熟妇啪啪区老熟熟女 | 日日摸天天添天天添破 | 成人一区二区三区在线 | 女女同性女同一区二区三区按摩 | 久久春色 | 吖v在线| 国产精选一区二区三区 | 亚洲性生活大片 | 午夜成人影片 | 国产精品老牛影院99av | 手机av观看| 亚洲成人午夜电影 | 国产成人精品亚洲男人的天堂 | 国产字幕侵犯亲女 | 4438全国最大成人网 | 黄色片久久 | 国产啊啊啊啊 | 久久久精品中文字幕麻豆发布 | 日韩国产高清在线 | 性猛交xxxx乱大交孕妇印度 | 乱lun合集小可的奶水 | 一级欧美视频 | 国产天堂久久 | 香蕉一区二区三区四区 | 黄色录像网址 | 成人性生交大片免费看r链接 | 337p粉嫩色噜噜噜大肥臀 | 香蕉福利视频 | 99这里有精品 | 日本成人综合 | 日本久操视频 | 国产伦精品一区二区三区照片91 | 日韩av片免费观看 | 粉嫩av四季av绯色av | 成人在线免费播放视频 | 中文字幕免费一区 | 日韩av一区在线播放 | 色婷婷婷婷色 | 2级黄色片| 锦绣未央在线观看 | 91香蕉国产 | 性喷潮久久久久久久久 | 老师上课夹震蛋高潮了 | av福利在线| 欧美成人黄色小视频 | 亚洲日批视频 | 爱如潮水3免费观看日本高清 | 国产一级在线 | 99资源| 一本无码aⅴ久久久国产 | 91精品国产乱码久久久久 | 欧美日本韩国一区二区 | 免费看a的网站 | 97久久人人超碰caoprom欧美 | 欧美性在线视频 | 欧美性猛交xxxx乱 | 青青草成人在线 | 最新日本中文字幕 | 亚洲综合大片69999 | 人人爱国产| 国产操 | xxxx69国产| 黄av网站| 国产欧美一区二区三区另类精品 | 经典三级第一页 | 日韩av成人网 | 校霸被c到爽夹震蛋上课高潮 | 夜夜爽天天干 | 色播基地 | 久久久久久久久99 | 亚洲国产欧美在线 | 九九热精品在线视频 | 欧美国产高潮xxxx1819 |