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

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

三分鐘帶你搞懂 Future 玩法

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

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

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

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

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

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

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

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

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

二、Future

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

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

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

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

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

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

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

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

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

2.1、Future 接口方法

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

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

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

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

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

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

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

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

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

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

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

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

2.2、Future 接口實現類

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、小結

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

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

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

四、參考

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 自動化在DevOps中的力量:簡化軟件開發和交付

    自動化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動化工具和方法,DevOps團隊可以實現以下目標:消除手動和重復性任務。簡化流程。在整個軟件開發生命周期中實現更
  • 雅柏威士忌多款單品價格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業觀察編 | 肖海林今年以來,威士忌市場開始出現了降溫跡象,越來越多不斷暴漲的網紅威士忌也開始悄然回歸市場理性。近日,LVMH集團旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的&ldquo;網紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內直播,
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預測小
  • 三星顯示已開始為AR設備研發硅基LED微顯示屏

    7月18日消息,據外媒報道,隨著蘋果首款頭顯產品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產品也就將成為各大公司下一個重要的競爭領域,對顯示屏這一關
Top 主站蜘蛛池模板: 青铜峡市| 巍山| 北票市| 韶山市| 阳泉市| 平果县| 梓潼县| 金寨县| 唐山市| 工布江达县| 赞皇县| 牡丹江市| 西昌市| 巨鹿县| 颍上县| 云安县| 安龙县| 望都县| 前郭尔| 伊吾县| 陈巴尔虎旗| 合阳县| 岗巴县| 高雄市| 子长县| 阳东县| 乐平市| 寿宁县| 绥芬河市| 舟曲县| 会泽县| 绥宁县| 滁州市| 通道| 当涂县| 禄劝| 龙海市| 内江市| 江孜县| 体育| 泰来县|