驗(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)的.
歡迎指教