亚洲精品亚洲人成在线观看麻豆,在线欧美视频一区,亚洲国产精品一区二区动图,色综合久久丁香婷婷

              當前位置:首頁 > IT技術 > 其他 > 正文

              FutureTask 使用詳解
              2022-05-31 17:19:58

              ?

              FutureTask?相關

              https://zhuanlan.zhihu.com/p/377296488

              ?

              ?

              概述

              FutureTask?可取消的異步任務,提供Future的基礎實現(xiàn),并實現(xiàn)了Runnable接口。FutureTask包含了取消與啟動計算的方法,查詢計算是否完成以及檢索計算結果的方法。只有在計算完成才能檢索到結果,調(diào)用get()方法時如果任務還沒有完成將會阻塞調(diào)用線程至到任務完成。一旦計算完成就不能重新開始與取消計算,但可以調(diào)用runAndReset()重置狀態(tài)后再重新計算。

              類圖

              ?

              ?

              FutureTask實現(xiàn)了RunnableFuture接口,而RunnableFuture接口擴展自Future?Runnable接口,在創(chuàng)建FutureTask時可以使用Callable接口的實例或者Lambda表達式,也可以使用Runnable的實例,但內(nèi)部還是會使用適配器模式轉換成Callable實例類型。

              創(chuàng)建第一個任務

              使用Callable創(chuàng)建一個FutureTask實例:

              FutureTask<Boolean> future = new FutureTask<>(new Callable<Boolean>() {
                 @Override
                 public Boolean call() throws Exception {
                   return true;
                 }
               });

              通過new一個對象的方法可以直接創(chuàng)建一個FutureTask實例,如果直接調(diào)用run方法將直接在當前線程中運行,不會開啟新線程。

              使用ExecutorService或者線程可以讓FutureTask進行托管進行,示例如下:

              //托管給線程池處理
              Future<?> futureResult = Executors.newCachedThreadPool().submit(future);
              //托管給單獨線程處理
              new Thread(future).start();

              因為FutureTask繼承了Runnable接口,所以它可以通過new Thread()的方式進行運行,再由future變量來檢索結果值或者取消任務等操作,通過線程池托管的方式也可以適用。

              取消任務

              遇到特殊情況時需要對沒有運行的或者已經(jīng)運行的任務進行取消操作,這時可以調(diào)用cancel()方法,取消方法有一個布爾類型的參數(shù)mayInterruptIfRunning;當值為ture時將嘗試中斷托管的線程(調(diào)用托管線程的interrupt嘗試中斷)。

              取消任務使用的是線程的中斷操作,如果任務是可取消的,在任務中存在阻塞線程的地方需要加上InterruptedException的異常捕獲來處理中斷異?;蛘咴谌蝿湛扇∠c使用Thread.currentThread().isInterrupted()方法來判斷任務是否已經(jīng)發(fā)送的中斷請求以正常取消任務。

              檢索結果值

              使用FutureTask的一個重要目的是為了能獲取到任務的結果值,使用Callable使用一個任務調(diào)用點時可以在任務中返回一個引用類型。

              FutureTask內(nèi)部使用outcome變量存儲Callable的結果,調(diào)用FutureTask.get()方法將檢索結果值,但get()方法也會阻塞調(diào)用線程直到任務執(zhí)行完成或者取消。

              get()方法還可以通過設置超時時間來指定等待的時長,超過等待時間后將會拋出TimeoutException異常。

              總結

              使用FutureTask可以完成任務的取消、檢查結果值,這兩項也是FutureTask的特色,但FutureTask的底層還是托管給Thread完成;相對于Thread檢查結果值會更新的方便,不再需要管理線程執(zhí)行的狀態(tài)與值。

              在使用cancel方法需要注意任務是否可以取消,在任務內(nèi)部需要使用Thread.currentThread().isInterrupted()檢查中斷狀態(tài)并在Thread.sleep()?condition.wait()?Thread.join()?Thread.wait()使用線程進行阻塞以及可中斷的I/O操作方法中捕獲InterruptedException異常以避免不必要的情況發(fā)生,在大多數(shù)任務中是不應該被中斷的,所以最好在可中斷的任務中設置好檢查點;在任務線程會被阻塞點捕獲InterruptedException異常,根據(jù)情況判斷是否需要取消任務。

              ?

              ?

              ?

              ?

              本文摘自 :https://www.cnblogs.com/

              開通會員,享受整站包年服務立即開通 >