AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

三分鐘帶你搞懂 Future 玩法

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

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

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

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

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

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

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

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

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

二、Future

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

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

下面我們先來看一個簡單的示例,以便于更好的理解!zun28資訊網——每日最新資訊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();    }}

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

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

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

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

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

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

2.1、Future 接口方法

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

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

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

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

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

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

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

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

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

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

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

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

2.2、Future 接口實現類

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

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

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

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

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

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

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

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

具體示例如下:zun28資訊網——每日最新資訊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();    }}

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

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

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

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

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

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

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

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

三、小結

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

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

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

四、參考

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 2023年,我眼中的字節跳動

    此時此刻(2023年7月),字節跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關注的互聯網公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz&ldquo;難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?&rdquo;這一番話,出自百合網聯合創
  • 華為HarmonyOS 4升級計劃公布:首批34款機型今日開啟公測

    8月4日消息,今天下午華為正式發布了HarmonyOS 4系統,在更流暢的前提下,還帶來了不少新功能,UI設計也有變化,會讓手機煥然一新。華為宣布,首批機型將會在
  • OPPO K11采用全方位護眼屏:三大護眼能力減輕視覺疲勞

    日前OPPO官方宣布,全新的OPPO K11將于7月25日正式發布,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼IMX890主攝,堪稱是2000檔位影像表
  • 聯想的ThinkBook Plus下一版曝光,鍵盤旁邊塞個平板

    ThinkBook Plus 是聯想的一個特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據有人爆料,聯想的下一款 ThinkBook Plus 可能更特殊,它
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀。  美國時間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內容審核等。此前,T
  • 中關村論壇11月25日開幕,15位諾獎級大咖將發表演講

    11月18日,記者從2022中關村論壇新聞發布會上獲悉,中關村論壇將于11月25至30日在京舉行。本屆中關村論壇由科學技術部、國家發展改革委、工業和信息化部、國務
Top