這個問題在這里已經有了答案: CompletableFuture 沒有被執行。如果我使用 ExecutorService 池,它可以按預期作業,但不能使用常見的 ForkJoinPool (1 個答案) 5 天前關閉。
為什么下面的代碼不列印I just woke up
import java.util.concurrent.CompletableFuture;
public class CompletableFutureTest {
public static void main(String[] args) {
CompletableFuture completableFuture = CompletableFuture.runAsync(()->{
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I just woke up.");
});
System.out.println("I am main");
}
}
下面給出的代碼列印I just woke up
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CompletableFutureTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
CompletableFuture completableFuture = CompletableFuture.runAsync(()->{
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I just woke up.");
}, executorService);
executorService.shutdown();
System.out.println("I am main");
}
}
兩個代碼之間可能的顯著差異是第二個代碼示例將 Single Thread pool 帶入 runAsync 方法,而第一個不帶任何引數,即它使用 ForkJoin 池。I just woke up請幫我了解第一個程式中未列印的原因
uj5u.com熱心網友回復:
從ForkJoinPool
...所有作業執行緒都使用Thread.isDaemon() set true進行初始化。
從Executors.defaultThreadFactory
...每個新執行緒都被創建為非守護執行緒。
從Thread.setDaemon
...當唯一運行的執行緒都是守護執行緒時,Java 虛擬機退出。
在第一種情況下,執行緒來自ForkJoinPool.commonPool,因此它是守護行程。
在第二種情況下,執行緒是使用創建的Executors.defaultThreadFactory,非守護行程也是如此。
這解釋了不同的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424585.html
