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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

并发编程-21J.U.C组件拓展之Future和FutureTask

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并发编程-21J.U.C组件拓展之Future和FutureTask 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 概述
  • FutureTask的三種運行狀態
  • FutureTask的三種運行狀態下的get/cancel操作及結果
  • FutureTask的實現
  • FutureTask的使用
  • 示例
    • Future
    • FutureTask
  • 代碼

概述

Future接口和實現Future接口的FutureTask類,代表異步計算的結果。

FutureTask除了實現Future接口外,還實現了Runnable接口。因此,FutureTask可以交給Executor執行,也可以由調用線程直接執行(FutureTask.run())。


FutureTask的三種運行狀態

根據FutureTask.run()方法被執行的時機,FutureTask可以處于下面3種狀態

  • 未啟動。FutureTask.run()方法還沒有被執行之前,FutureTask處于未啟動狀態。當創建一個FutureTask,且沒有執行FutureTask.run()方法之前,這個FutureTask處于未啟動狀態。
  • 已啟動。FutureTask.run()方法被執行的過程中,FutureTask處于已啟動狀態。
  • 已完成。FutureTask.run()方法執行完后正常結束,或被取消(FutureTask.cancel(…)),或執行FutureTask.run()方法時拋出異常而異常結束,FutureTask處于已完成狀態。

FutureTask的三種運行狀態下的get/cancel操作及結果

  • 當FutureTask處于未啟動或已啟動狀態時,執行FutureTask.get()方法將導致調用線程阻塞

  • 當FutureTask處于已完成狀態時,執行FutureTask.get()方法將導致調用線程立即返回結果或拋出異常

  • 當FutureTask處于未啟動狀態時,執行FutureTask.cancel()方法將導致此任務永遠不會被執行

  • 當FutureTask處于已啟動狀態時,執行FutureTask.cancel(true)方法將以中斷執行此任務線程的方式來試圖停止任務

  • 當FutureTask處于已啟動狀態時,執行FutureTask.cancel(false)方法將不會對正在執行此任務的線程產生影響(讓正在執行的任務運行完成)

  • 當FutureTask處于已完成狀態時,執行FutureTask.cancel(…)方法將返回false。


FutureTask的實現

FutureTask的實現基于AbstractQueuedSynchronizer(AQS)。

AQS是一個同步框架,它提供通用機制來原子性管理同步狀態、阻塞和喚醒線程,以及維護被阻塞線程的隊列。

基于AQS實現的同步器包括:ReentrantLock、Semaphore、ReentrantReadWriteLock、CountDownLatch和FutureTask

并發編程-15并發容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象隊列同步器AQS介紹

每一個基于AQS實現的同步器都會包含兩種類型的操作

  • 至少一個acquire操作。這個操作阻塞調用線程,除非/直到AQS的狀態允許這個線程繼續執行。FutureTask的acquire操作為get()/get(long timeout,TimeUnit unit)方法調用

  • 至少一個release操作。這個操作改變AQS的狀態,改變后的狀態可允許一個或多個阻塞線程被解除阻塞。FutureTask的release操作包括run()方法和cancel(…)方法


基于“復合優先于繼承”的原則,FutureTask聲明了一個內部私有的繼承于AQS的子類Sync,對FutureTask所有公有方法的調用都會委托給這個內部子類

AQS被作為“模板方法模式”的基礎類提供給FutureTask的內部子類Sync,這個內部子類只需要實現狀態檢查和狀態更新的方法即可,這些方法將控制FutureTask的獲取和釋放操作。具體來說,Sync實現了AQS的tryAcquireShared(int)方法和tryReleaseShared(int)方法,Sync通過這兩個方法來檢查和更新同步狀態。


FutureTask的使用

  • 可以把FutureTask交給Executor執行

  • 也可以通過ExecutorService.submit(…)方法返回一個FutureTask,然后執行FutureTask.get()方法或FutureTask.cancel(…)方法

  • 除此以外,還可以單獨使用FutureTask

當一個線程需要等待另一個線程把某個任務執行完后它才能繼續執行,此時可以使用FutureTask.


示例

Future

package com.artisan.example.aqs;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;@Slf4j public class FutureExample {static class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {// 耗時任務log.info("do something in callable start");Thread.sleep(5000);log.info("do something in callable end");return "DONE";}}public static void main(String[] args) throws Exception {// 創建一個newCachedThreadPool線程池ExecutorService executorService = Executors.newCachedThreadPool();// submit任務Future<String> future = executorService.submit(new MyCallable());// 主線程模擬一些業務操作,假設耗時一秒log.info("do something in main begin");Thread.sleep(1000);log.info("do something in main finish");// 獲取剛才提交的線程MyCallable的返回結果log.info("獲取MyCallable的返回結果,如果未返回,主線程將阻塞,處于等待狀態");String result = future.get();log.info("result:{}", result);// 關閉線程池executorService.shutdown();} }

觀察執行結果:


FutureTask

package com.artisan.example.aqs;import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask;import lombok.extern.slf4j.Slf4j;@Slf4j public class FutureTaskExample {public static void main(String[] args) throws Exception {FutureTask<String> futureTask = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {// 耗時任務log.info("do something in callable");Thread.sleep(5000);return "DONE";}});//創建一個newCachedThreadPool線程池ExecutorService executorService = Executors.newCachedThreadPool();// execute futureTask任務executorService.execute(futureTask);// 主線程模擬一些業務操作,假設耗時一秒log.info("do something in main begin");Thread.sleep(1000);log.info("do something in main finish");// 獲取剛才提交的線程MyCallable的返回結果log.info("獲取futureTask的返回結果,如果未返回,主線程將阻塞,處于等待狀態");String result = futureTask.get();log.info("result:{}", result);// 關閉線程池executorService.shutdown();} }


代碼

https://github.com/yangshangwei/ConcurrencyMaster

總結

以上是生活随笔為你收集整理的并发编程-21J.U.C组件拓展之Future和FutureTask的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 中文字幕在线免费观看 | 亚洲特黄特色 | 99国产精品久久久久99打野战 | 国产精品jizz在线观看无码 | 日韩一二三四 | 国产在线观看免费高清 | 日本在线播放 | 免费日韩一区二区 | 黄色免费网站 | 新天堂在线 | 久久视频在线免费观看 | 捆绑束缚调教 | 日xxxx| 国产精彩视频一区 | 天天爽夜夜爽夜夜爽 | 伊人手机视频 | 毛片大全 | 林雅儿欧洲留学恋爱日记在线 | 天天操综合网 | 韩国av毛片 | 国产嫩草在线 | 99久久婷婷国产精品综合 | 国内偷拍精品视频 | 超能一家人电影免费喜剧在线观看 | 天天操天天弄 | 在线免费你懂的 | 69xx国产 | 免费成人激情视频 | 亚洲最大中文字幕 | 四虎成人精品在永久免费 | 爱情岛论坛永久入址在线 | 97精品熟女少妇一区二区三区 | 国产情侣小视频 | 久久伊人网站 | 人妻毛片 | 国产精品福利在线观看 | 97se视频| 四虎一区二区 | 天天操综合网 | 99热国 | 亚洲人体视频 | 女人扒开腿让男人捅爽 | 五月天久久婷婷 | 久久99久久99精品免观看软件 | 亚洲区小说区 | 国产伦精品一区二区三区网站 | 在线观看特色大片免费网站 | 国产精品伦一区二区三级古装电影 | 日本肉体xxxx裸体xxx免费 | 欧美成人黑人猛交 | 国产一区二区视频在线免费观看 | 奇米成人网 | 激情精品 | 天天黄色片 | 婷婷91| 国产精品午夜福利视频234区 | 色欲av永久无码精品无码蜜桃 | 久久久久色 | 男人天堂手机在线观看 | www.久久久久久久久久 | 亚洲视频在线视频 | 欧美极品少妇xxxxⅹ免费视频 | 丰腴饱满的极品熟妇 | 亚洲美女操 | 天堂成人国产精品一区 | 糖心vlog精品一区二区 | 欧美三级网站 | 国产精品电影院 | 中文字幕在线视频不卡 | 蜜桃91丨九色丨蝌蚪91桃色 | 国产精品三级久久久久久电影 | 亚洲成年人影院 | 四季av一区二区凹凸精品 | 小情侣高清国产在线播放 | 久久综合桃花网 | 欧美交换配乱吟粗大25p | 日韩国产毛片 | 中文字幕影片免费在线观看 | av一区二区在线播放 | 夜夜涩| 日本免费三级网站 | 免费看污片网站 | 国产裸体舞一区二区三区 | 黄网在线看 | 国产二区精品 | 久草免费在线视频 | 日本污视频在线观看 | 青草草在线 | 亚洲成人精品一区二区 | 天天做天天爱天天操 | 韩国三级hd两男一女 | 久久性生活片 | av成人动漫| 咪咪成人网 | 国产精品视频大全 | 日韩欧美黄色网址 | 日本一区二区视频在线观看 | 欧美日韩中字 | 日韩电影精品 |