Java8之CompletableFuture async的理解

驗(yàn)證代碼如下

ExecutorService executorService = Executors.newFixedThreadPool(3);

CompletableFuture a1 = CompletableFuture.supplyAsync(() -> {

logger.info("線程1{}{}","開(kāi)始");

try {

??????? TimeUnit.MILLISECONDS.sleep(100);

}catch (InterruptedException e) {

??????? e.printStackTrace();

}

???? logger.info("線程1{}{}","結(jié)束");

???? return "1";

},executorService);

CompletableFuture a2 = CompletableFuture.supplyAsync(() -> {

logger.info("線程2{}{}","開(kāi)始");

try {

????? TimeUnit.MILLISECONDS.sleep(100);

}catch (InterruptedException e) {

????? e.printStackTrace();

}

?logger.info("線程2{}{}","結(jié)束");

?return "1";

},executorService);

CompletableFuture a= a1.thenCombineAsync(a2,(s1,s2) -> {

? logger.info("組合線程{}{}");

? return? s1+s2;

},executorService);

Object result = a.get();

當(dāng)executorService線程池大小為2時(shí)候,執(zhí)行結(jié)果如下:

[pool-4-thread-1] INFO test.rcd.thread.CompletableFutureDemo.lambda$mains$4:127 - 組合線程{}{}

a1.thenCombineAsync方法始終被線程1或2執(zhí)行,

當(dāng)executorService線程池大小為3時(shí)候,執(zhí)行結(jié)果如下:

[pool-4-thread-3] INFO test.rcd.thread.CompletableFutureDemo.lambda$mains$4:127 - 組合線程{}{}

a1.thenCombineAsync方法始終被線程3執(zhí)行,

改為a1.thenCombine(),執(zhí)行結(jié)果:

a1.thenCombineAsync方法始終被線程1或2執(zhí)行,

由此可見(jiàn),async方法始終嘗試取新線程執(zhí)行方法,不帶async方法則會(huì)從當(dāng)前線程里取線程執(zhí)行.CompletableFuture似是與線程無(wú)關(guān)的.

歡迎指教

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容