日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

三分鐘帶你搞懂 Future 玩法

來源: 責編: 時間:2024-01-16 10:17:03 315觀看
導讀一、摘要在前幾篇線程系列文章中,我們介紹了線程池的相關技術,任務執行類只需要實現Runnable接口,然后交給線程池,就可以輕松的實現異步執行多個任務的目標,提升程序的執行效率,比如如下異步執行任務下載。// 創建一個線程
一、摘要

在前幾篇線程系列文章中,我們介紹了線程池的相關技術,任務執行類只需要實現Runnable接口,然后交給線程池,就可以輕松的實現異步執行多個任務的目標,提升程序的執行效率,比如如下異步執行任務下載。0hy28資訊網——每日最新資訊28at.com

// 創建一個線程池ExecutorService executor = Executors.newFixedThreadPool(2);// 提交任務executor.submit(new Runnable() {    @Override    public void run() {        // 執行下載某文件任務        System.out.println("執行下載某文件任務");    }});

而實際上Runnable接口并不能滿足所有的需求,比如有些場景下,我們想要獲取任務執行的返回結果,Runnable接口因為無返回值,只能想辦法通過額外的方式來寫入和讀取,操作起來十分不便。0hy28資訊網——每日最新資訊28at.com

因此,從 JDK 1.5 開始,Java 標準庫提供了一個Callable接口,與Runnable接口相比,它的方法上多了一個返回值;同時Callable是一個泛型接口,可以返回指定類型的結果,比如如下的實現類!0hy28資訊網——每日最新資訊28at.com

public class Task implements Callable<String> {    @Override    public String call() throws Exception {        // 執行下載某文件任務        System.out.println("執行下載某文件任務");        return "xxx";    }}

問題來了,如何獲取異步執行的結果呢?0hy28資訊網——每日最新資訊28at.com

在 JDK 1.5 中,Java 標準庫還提供了一個Future接口,它可以用來獲取異步執行的結果。0hy28資訊網——每日最新資訊28at.com

下面我們一起來了解一下這個Future接口!0hy28資訊網——每日最新資訊28at.com

二、Future

Future接口,表示一個可能還沒有完成異步任務的結果,它提供了檢查任務是否已完成、以及等待任務完成并獲取結果等方法。0hy28資訊網——每日最新資訊28at.com

如果看過ExecutorService.submit()方法,會發現它的返回參數都是Future類型,Future類型的實例可以用來獲取異步任務執行的結果。0hy28資訊網——每日最新資訊28at.com

下面我們先來看一個簡單的示例,以便于更好的理解!0hy28資訊網——每日最新資訊28at.com

public class Task implements Callable<String> {        @Override    public String call() throws Exception {        // 執行下載某文件任務,并返回文件名稱        System.out.println("thread name:" +  Thread.currentThread().getName() + " 開始執行下載任務");        return "xxx.png";    }}
public class FutureTest {    public static void main(String[] args) throws Exception {        // 創建一個線程池        ExecutorService executor = Executors.newFixedThreadPool(1);        // 初始化一個任務        Callable<String> task = new Task();        // 提交任務并獲得Future的實例        Future<String> future = executor.submit(task);        // 從Future獲取異步執行返回的結果(可能會阻塞等待結果)        String result =future.get();        System.out.println("任務執行結果:" +  result);        // 任務執行完畢之后,關閉線程池(可選)        executor.shutdown();    }}

輸出結果如下:0hy28資訊網——每日最新資訊28at.com

thread name:pool-1-thread-1 開始執行下載任務任務執行結果:xxx.png

從以上的示例可以清晰的看到,當需要獲取異步線程的執行結果返回值時,通常需要搭配使用Future和Callable接口來實現,大體可以用如下步驟來概括:0hy28資訊網——每日最新資訊28at.com

  • 首先提交一個實現Callable接口的任務到線程池中
  • 然后獲取一個Future類型的對象
  • 最后在主線程中調用Future對象的get()方法,如果異步任務執行完成,就可以直接獲得結果;如果異步任務執行沒有完成,get()方法會阻塞,直到任務執行完成后才能獲取結果

分析源碼你會發現,Callable接口主要用途是定義一個支持返回結果的方法;重點實現主要集中在Future接口上。0hy28資訊網——每日最新資訊28at.com

下面我們重點來看下Future接口方法!0hy28資訊網——每日最新資訊28at.com

2.1、Future 接口方法

方法
0hy28資訊網——每日最新資訊28at.com

描述
0hy28資訊網——每日最新資訊28at.com

get()0hy28資訊網——每日最新資訊28at.com

獲取結果(會阻塞等待)
0hy28資訊網——每日最新資訊28at.com

get(long timeout, TimeUnit unit)0hy28資訊網——每日最新資訊28at.com

在指定的時間內獲取結果,如果超時,會拋異常并退出等待狀態
0hy28資訊網——每日最新資訊28at.com

cancel(boolean mayInterruptIfRunning)0hy28資訊網——每日最新資訊28at.com

嘗試取消當前任務,當傳入參數為true時,表示嘗試中斷任務的執行,false表示不中斷,繼續執行直到完成,如果取消成功,返回true;反之false0hy28資訊網——每日最新資訊28at.com

isCancelled()0hy28資訊網——每日最新資訊28at.com

判斷任務是否已取消
0hy28資訊網——每日最新資訊28at.com

isDone()0hy28資訊網——每日最新資訊28at.com

判斷任務是否已完成
0hy28資訊網——每日最新資訊28at.com

2.2、Future 接口實現類

Future本質其實是一個接口,并不是具體的實現類,真正負責工作的還是它的實現類來完成。0hy28資訊網——每日最新資訊28at.com

我們還是以上文的線程池ExecutorService.submit()方法為例,看看它用的是哪種實現類!0hy28資訊網——每日最新資訊28at.com

分析一下源碼,會發現線程池用的實現類是FutureTask,關鍵核心源碼如下:0hy28資訊網——每日最新資訊28at.com

protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {    return new FutureTask<T>(callable);}

FutureTask類是一個實現了Future接口所有功能的具體類,可直接使用它來實現獲取異步任務執行的結果值。0hy28資訊網——每日最新資訊28at.com

FutureTask的工作原理其實也并不復雜,它接受一個Callable或者Runnable對象作為參數,然后在線程池執行器中執行該任務,最后通過get()方法可以同步等待獲取任務的執行結果。0hy28資訊網——每日最新資訊28at.com

真正起到關鍵作用的是,在FutureTask內部,封裝了一個狀態變量,用于記錄任務的狀態(等待、運行、完成、取消等),以及任務執行結果或異常信息,通過該狀態變量,我們可以判斷任務是否已完成、以及獲取任務的執行結果等信息。0hy28資訊網——每日最新資訊28at.com

因為FutureTask也實現了Runnable接口,因此我們也可以將FutureTask作為任務,提交給線程池執行器。0hy28資訊網——每日最新資訊28at.com

具體示例如下:0hy28資訊網——每日最新資訊28at.com

public class FutureTest {    public static void main(String[] args) throws Exception {        // 1.創建一個線程池        ExecutorService executor = Executors.newFixedThreadPool(1);        // 2.初始化一個任務        Callable<String> callable = new Task();        // 3.創建FutureTask對象        FutureTask<String> futureTask = new FutureTask<>(callable);        // 4.提交任務給執行器執行        executor.execute(futureTask);        // 5.獲取任務的執行結果        String result = futureTask.get(3, TimeUnit.SECONDS);        System.out.println("任務執行結果:" +  result);        // 6.關閉線程池(可選)        executor.shutdown();    }}

輸出結果同上!0hy28資訊網——每日最新資訊28at.com

如果想嘗試取消任務的執行,也可以通過如下方式來實現!0hy28資訊網——每日最新資訊28at.com

boolean isSuccess = futureTask.cancel(true);System.out.println("任務是否取消成功:" +  isSuccess);

除此之外,如果仔細的分析Future接口的類關系,會發現它的實現類非常的多,FutureTask只是它的一個基礎實現類而已,部分類關系圖如下!0hy28資訊網——每日最新資訊28at.com

圖片圖片0hy28資訊網——每日最新資訊28at.com

其它常用實現類簡介:0hy28資訊網——每日最新資訊28at.com

  • CompletableFuture:支持傳入回調對象,當異步任務完成或者發生異常時,自動調用回調對象的回調方法
  • ForkJoinTask:支持把一個大任務拆成多個小任務,然后并行執行,在多核 CPU 上可以顯著提升程序的執行效率
  • ScheduledFuture:支持周期性定時的執行任務,其中ScheduledFutureTask是一個私有類,只能通過ScheduledThreadPoolExecutor初始化操作

關于CompletableFuture、ForkJoinTask和ScheduledFuture,我們會在后面的文章中,再次單獨介紹具體的用法。0hy28資訊網——每日最新資訊28at.com

三、小結

本文主要圍繞Future接口用法做了一次簡單的知識總結,其中FutureTask類是Future接口中一個非常重要的實現類,通過它可以獲取異步任務執行的返回值,通常用于異步計算帶有返回值的任務。0hy28資訊網——每日最新資訊28at.com

限于篇幅的原因,本文沒有對FutureTask做過深入的原理講解,主要圍繞具體用法進行介紹,有興趣的朋友可以閱讀這篇文章《Java的Future機制詳解》,以便更清晰的了解它的實現原理。0hy28資訊網——每日最新資訊28at.com

如果有描述不對的地方,歡迎留言指出,共同進步!0hy28資訊網——每日最新資訊28at.com

四、參考

1.https://www.liaoxuefeng.com/wiki/1252599548343744/13065811551846740hy28資訊網——每日最新資訊28at.com

2.https://www.cnblogs.com/xrq730/p/4872722.html0hy28資訊網——每日最新資訊28at.com

3.https://juejin.cn/post/72310740607879086630hy28資訊網——每日最新資訊28at.com

4.https://zhuanlan.zhihu.com/p/544597700hy28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-62362-0.html三分鐘帶你搞懂 Future 玩法

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: IT降本50%還賊穩!百萬訂單規模系統的技術治理實踐

下一篇: Swift 可選類型、可選綁定和可選鏈

標簽:
  • 熱門焦點
  • 官方承諾:K60至尊版將會首批升級MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會搭載天璣9200+處理器和獨顯芯片X7的同時,Redmi給出了官方承諾,K60至尊重大更新首批升級,會首批推送MIUI 15。也就是說雖然
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力?! RM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度?! RM軟件市場規模如今超過580
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內容電商的概念興起,抖音、快手、小紅書組成的&ldquo;新電商三兄弟&rdquo;成為業內一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 引領旗艦級影像能力向中端機普及 OPPO K11 系列發布 1799 元起

    7月25日,OPPO正式發布K系列新品—— OPPO K11 。此次 K11 在中端手機市場長期被忽視的影像板塊發力,突破性地搭載索尼 IMX890 旗艦大底主攝,支持 OIS
  • 榮耀Magic4 至臻版 首創智慧隱私通話 強勁影音系統

    2022年第一季度臨近尾聲,在該季度內,許多品牌陸續發布自己的最新產品,讓大家從全新的角度來了解當今的手機技術。手機是電子設備中,更新迭代十分迅速的一款產品,基
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美亚洲成人免费| 亚洲一区二区在线免费观看视频| 亚洲欧洲精品一区二区三区不卡| 美日韩精品免费观看视频| 老牛国产精品一区的观看方式| 亚洲一区二区三区影院| 午夜精品影院| 久久综合伊人77777| 欧美日韩精品一本二本三本| 国产精品乱看| 在线观看视频一区二区欧美日韩| 国产欧美一区二区三区国产幕精品 | 国产亚洲精品bv在线观看| 久久久激情视频| 欧美激情成人在线| 国产精品毛片在线| 在线观看日韩国产| 亚洲尤物在线视频观看| 久久久久久网站| 欧美三级日本三级少妇99| 国产一区二区三区av电影| 亚洲国产日韩一级| 亚洲欧美国产精品va在线观看| 亚洲视频综合| 久久久久久久综合| 欧美午夜性色大片在线观看| 伊人久久婷婷| 在线亚洲+欧美+日本专区| 久久久精品免费视频| 欧美色图一区二区三区| 极品日韩av| 亚洲综合精品| 欧美精品激情blacked18| 国产精品福利在线观看| 亚洲国产高清aⅴ视频| 小嫩嫩精品导航| 欧美激情一区二区三区成人| 国产有码在线一区二区视频| 一区二区三区回区在观看免费视频| 亚洲少妇一区| 久久综合中文色婷婷| 国产精品毛片大码女人| 亚洲精品视频一区| 久久亚洲精品伦理| 国产欧美一区二区色老头| 一区二区不卡在线视频 午夜欧美不卡' | 黄色精品一区| 亚洲婷婷综合色高清在线| 免费一区视频| 国内外成人免费激情在线视频| 国产亚洲精品v| 一区二区免费在线观看| 六月婷婷一区| 国产一区二区在线免费观看| 一区二区三区免费在线观看| 亚洲天堂久久| 久久精品综合| 国产精品久久久久久久久久ktv| 欧美本精品男人aⅴ天堂| 国产女主播一区| 亚洲精品中文字幕在线观看| 久久久国产一区二区三区| 国产精品一卡二卡| 亚洲乱码国产乱码精品精可以看| 中文在线一区| 欧美福利专区| 国际精品欧美精品| 香蕉久久夜色精品国产| 国产精品theporn88| 亚洲伦理精品| 欧美顶级艳妇交换群宴| 亚洲第一精品在线| 久久婷婷国产综合国色天香| 国产一级揄自揄精品视频| 亚洲欧美一区二区在线观看| 国产精品九九久久久久久久| 一区二区三区三区在线| 欧美精品综合| 亚洲精品国产系列| 欧美好吊妞视频| 最近看过的日韩成人| 美女脱光内衣内裤视频久久影院 | 久久精品国产99国产精品| 国产精品久久久久久av福利软件| 国语自产精品视频在线看抢先版结局 | 久久精品国内一区二区三区| 国产九色精品成人porny| 亚洲欧美中文字幕| 国产欧美精品xxxx另类| 亚洲在线第一页| 国产精品老牛| 校园春色国产精品| 国产日韩精品综合网站| 久久国产99| 伊人夜夜躁av伊人久久| 免播放器亚洲一区| 亚洲欧洲一区二区三区在线观看 | 亚洲男女自偷自拍图片另类| 国产精品久久久久久久久久久久 | 亚洲国产三级网| 免费亚洲电影在线| 亚洲精品在线三区| 欧美裸体一区二区三区| 一区二区电影免费在线观看| 国产精品高潮呻吟久久av无限 | 国产精品久久久久久久久婷婷| 极品少妇一区二区三区| 久久精品国产视频| 在线观看欧美精品| 欧美极品一区二区三区| 一区二区三区 在线观看视频 | 韩国av一区二区| 噜噜噜在线观看免费视频日韩| 国产精品午夜av在线| 小嫩嫩精品导航| 悠悠资源网久久精品| 欧美国产亚洲另类动漫| 亚洲天堂免费在线观看视频| 国产午夜精品美女视频明星a级| 亚洲视频你懂的| 国产精品一区二区久久国产| 久久久国产视频91| 亚洲日韩欧美视频一区| 国产精品观看| 久久久水蜜桃| 一区二区三区精品视频在线观看| 蜜臀久久99精品久久久久久9| 国产日韩精品在线| 久热精品视频在线观看一区| 日韩视频在线观看一区二区| 国产精品入口66mio| 久热精品在线| 亚洲色无码播放| 狠狠色狠狠色综合日日五| 欧美高清在线视频观看不卡| 亚洲综合精品四区| 亚洲国产欧美不卡在线观看| 国产精品高潮在线| 欧美 日韩 国产在线| 亚洲午夜一区二区三区| 一区二区三区在线观看国产| 欧美日韩另类视频| 久久久美女艺术照精彩视频福利播放| 国产夜色精品一区二区av| 欧美激情欧美狂野欧美精品| 亚洲欧美视频在线| 亚洲第一精品夜夜躁人人躁| 国产精品久久国产精麻豆99网站| 亚洲网站在线播放| 一区二区三区在线视频观看| 欧美视频久久| 美女精品一区| 欧美一区二区黄色| 亚洲自拍电影| 久久在线视频在线| 欧美日韩国产精品专区| 欧美1区免费| 欧美另类视频在线| 亚洲国产高清aⅴ视频| 亚洲男人第一av网站| 欧美日韩成人一区二区三区| 亚洲精品资源美女情侣酒店| 欧美福利精品| 亚洲精品一区二区三区在线观看| 亚洲三级毛片| 欧美视频在线免费看| 一区二区日韩伦理片| 欧美大片免费观看在线观看网站推荐 | 欧美中文字幕视频| 欧美在线看片| 欧美天堂亚洲电影院在线观看| 久久久久久穴| 91久久亚洲| 在线观看91精品国产入口| 国产精品老牛| 欧美精品18videos性欧美| 亚洲视频在线免费观看| 狠狠色丁香婷综合久久| 国产精品区二区三区日本| 久久精品一级爱片| 国产精品午夜久久| 久久视频一区二区| 亚洲欧美日韩电影| 永久免费视频成人| 免费国产一区二区| 99国产精品久久| 欧美日韩在线免费视频| 亚洲精品免费网站| 欧美**人妖| 99这里只有精品| 国内偷自视频区视频综合| 欧美日韩亚洲另类| 久久综合色天天久久综合图片| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品你懂的在线| 久久久久久97三级| 亚洲综合国产| 韩国精品主播一区二区在线观看| 在线视频日本亚洲性| 国产综合色精品一区二区三区| 亚洲欧美日韩电影| 国产伦精品一区二区三区在线观看 | 欧美精品一区在线| 欧美国产欧美亚洲国产日韩mv天天看完整 |