默認使用的線程池
不傳executor時默認使用ForkJoinPool.commonPool()
IntStream.range(0, 15).parallel().forEach(i -> { System.out.println(Thread.currentThread()); });
輸出
Thread[ForkJoinPool.commonPool-worker-1,5,main] Thread[main,5,main] Thread[ForkJoinPool.commonPool-worker-1,5,main] Thread[ForkJoinPool.commonPool-worker-3,5,main] Thread[ForkJoinPool.commonPool-worker-2,5,main] Thread[ForkJoinPool.commonPool-worker-3,5,main] Thread[ForkJoinPool.commonPool-worker-1,5,main] Thread[main,5,main] Thread[ForkJoinPool.commonPool-worker-1,5,main] Thread[ForkJoinPool.commonPool-worker-3,5,main] Thread[ForkJoinPool.commonPool-worker-2,5,main] Thread[ForkJoinPool.commonPool-worker-3,5,main] Thread[ForkJoinPool.commonPool-worker-1,5,main] Thread[main,5,main] Thread[ForkJoinPool.commonPool-worker-2,5,main]
commonPool
thenRun測試實例1 不設定executorThis pool is statically constructed; its run state is unaffected by attempts to shutdown() or shutdownNow(). However this pool and any ongoing processing are automatically terminated upon program System.exit(int). Any program that relies on asynchronous task processing to complete before program termination should invoke commonPool().awaitQuiescence, before exit.
@Test public void testRunOnCommonPool() throws InterruptedException { CompletionStagefuturePrice = CompletableFuture.runAsync(() -> { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("test1:1 - runAsync(runnable), job thread: " + Thread.currentThread()); //Thread[ForkJoinPool.commonPool-worker-1,5,main] } ); System.out.println("test1:flag1"); futurePrice.thenRun(() -> { System.out.println("test1:2 - thenRun(runnable)), action thread: " + Thread.currentThread()); //Thread[ForkJoinPool.commonPool-worker-1,5,main] }); System.out.println("test1:flag2"); futurePrice.thenRunAsync(() -> { System.out.println("test1:3 - thenRunAsync(runnable), action thread: " + Thread.currentThread()); //Thread[ForkJoinPool.commonPool-worker-1,5,main] }); TimeUnit.SECONDS.sleep(100); }
輸出
test1:flag1 test1:flag2 test1:1 - runAsync(runnable), job thread: Thread[ForkJoinPool.commonPool-worker-1,5,main] test1:2 - thenRun(runnable)), action thread: Thread[ForkJoinPool.commonPool-worker-1,5,main] test1:3 - thenRunAsync(runnable), action thread: Thread[ForkJoinPool.commonPool-worker-1,5,main]設定executor
@Test public void testRunOnExecutors() throws InterruptedException { CompletionStagefuturePrice = CompletableFuture.runAsync(() -> { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("test2:1 - runAsync(runnable, executor), job thread: " + Thread.currentThread()); //Thread[pool-1-thread-1,5,main] }, executor); System.out.println("test2:flag1"); futurePrice.thenRunAsync(() -> { System.out.println("test2:2 - thenRunAsync(runnable), action thread: " + Thread.currentThread()); //Thread[pool-1-thread-1,5,main] }); System.out.println("test2:flag2"); futurePrice.thenRun(() -> { System.out.println("test2:3 - thenRun(runnable), action thread: " + Thread.currentThread()); //Thread[pool-1-thread-2,5,main] }); futurePrice.thenRunAsync(() -> { System.out.println("test2:4 - thenRunAsync(runnable, executor), action thread: " + Thread.currentThread()); //Thread[ForkJoinPool.commonPool-worker-1,5,main] }, executor); TimeUnit.SECONDS.sleep(100); }
輸出
test2:flag1 test2:flag2 test2:1 - runAsync(runnable, executor), job thread: Thread[pool-1-thread-1,5,main] test2:3 - thenRun(runnable), action thread: Thread[pool-1-thread-1,5,main] test2:4 - thenRunAsync(runnable, executor), action thread: Thread[pool-1-thread-2,5,main] test2:2 - thenRunAsync(runnable), action thread: Thread[ForkJoinPool.commonPool-worker-1,5,main]thenRun測試實例2 沒有sleep
@Test public void testThenRun(){ CompletableFuturef1 = CompletableFuture.supplyAsync(() -> { System.out.println("f1 thread:"+Thread.currentThread().getName()); return "zero"; }, executor); f1.thenRun(new Runnable() { @Override public void run() { System.out.println("then run thread:"+Thread.currentThread().getName()); System.out.println("finished"); } }); TimeUnit.SECONDS.sleep(10); }
使用executor的輸出
f1 thread:pool-1-thread-1 then run thread:main finished
不使用executor的輸出
f1 thread:ForkJoinPool.commonPool-worker-1 then run thread:main finished加上sleep
CompletableFuturef1 = CompletableFuture.supplyAsync(() -> { System.out.println("f1 thread:"+Thread.currentThread().getName()); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } return "zero"; }, executor); f1.thenRun(new Runnable() { @Override public void run() { System.out.println("then run thread:"+Thread.currentThread().getName()); System.out.println("finished"); } }); TimeUnit.SECONDS.sleep(10);
使用executor的輸出
f1 thread:pool-1-thread-1 then run thread:pool-1-thread-1 finished
不使用executor的輸出
f1 thread:ForkJoinPool.commonPool-worker-1 then run thread:ForkJoinPool.commonPool-worker-1 finished小結
doc不帶 async 的 thenRun() 方法仍然是一個異步方法,可能是使用main線程,commonPool的線程或者是executor的線程。
ForkJoinPool.commonPool
理解 CompletableFuture 的任務與回調函數的線程
哪個線程執行 CompletableFuture’s tasks 和 callbacks?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66703.html
摘要:方法接受一個生產者作為參數,返回一個對象,該對象完成異步執行后會讀取調用生產者方法的返回值。該方法接收一個對象構成的數組,返回由第一個執行完畢的對象的返回值構成的。 一、Future 接口 在Future中觸發那些潛在耗時的操作把調用線程解放出來,讓它能繼續執行其他有價值的工作,不再需要呆呆等待耗時的操作完成。打個比方,你可以把它想象成這樣的場景:你拿了一袋子衣服到你中意的干洗店去洗。...
摘要:在這種方式中,主線程不會被阻塞,不需要一直等到子線程完成。主線程可以并行的執行其他任務。如果我們不想等待結果返回,我們可以把需要等待完成執行的邏輯寫入到回調函數中。任何立即執行完成那就是執行在主線程中嘗試刪除測試下。可以使用達成目的。 Java 8 有大量的新特性和增強如 Lambda 表達式,Streams,CompletableFuture等。在本篇文章中我將詳細解釋清楚Compl...
摘要:方法接收的是的實例,但是它沒有返回值方法是函數式接口,無參數,會返回一個結果這兩個方法是的升級,表示讓任務在指定的線程池中執行,不指定的話,通常任務是在線程池中執行的。該的接口是在線程使用舊的接口,它不允許返回值。 簡介 作為Java 8 Concurrency API改進而引入,本文是CompletableFuture類的功能和用例的介紹。同時在Java 9 也有對Completab...
摘要:并行流與目前,我們對集合進行計算有兩種方式并行流而更加的靈活,我們可以配置線程池的大小確保整體的計算不會因為等待而發生阻塞。 【回顧Future接口 Future接口時java5引入的,設計初衷是對將來某個時刻會發生的結果建模。它建模了一種異步計算,返回了一個執行預算結果的引用。比如,你去干洗店洗衣服,店員會告訴你什么時候可以來取衣服,而不是讓你一直在干洗店等待。要使用Future只需...
摘要:組合式異步編程最近這些年,兩種趨勢不斷地推動我們反思我們設計軟件的方式。第章中介紹的分支合并框架以及并行流是實現并行處理的寶貴工具它們將一個操作切分為多個子操作,在多個不同的核甚至是機器上并行地執行這些子操作。 CompletableFuture:組合式異步編程 最近這些年,兩種趨勢不斷地推動我們反思我們設計軟件的方式。第一種趨勢和應用運行的硬件平臺相關,第二種趨勢與應用程序的架構相關...
摘要:所以很容易出現某一個商店的數據遲遲無法返回的情況。工廠方法接受由對象構成的數組數組中所有的完成后它返回一個對象。異步的可以通過進行合并,無論他們之間是否有依賴關系。可以為注冊一個回調函數,在執行完畢時使用。 【最佳價格查詢器的優化 由于我們的兩個遠程服務:1.查詢價格,2.查詢折扣價格都是基于網絡的。所以很容易出現某一個商店的數據遲遲無法返回的情況。由于這些原因,我希望查詢器在查詢時能...
閱讀 2882·2021-09-28 09:36
閱讀 3608·2021-09-27 13:59
閱讀 2484·2021-08-31 09:44
閱讀 2278·2019-08-30 15:54
閱讀 2352·2019-08-30 15:44
閱讀 1180·2019-08-30 13:45
閱讀 1223·2019-08-29 18:38
閱讀 1207·2019-08-29 18:37