这个问题在这里已经有了答案:
无法执行completablefuture。如果我使用executorservice池,它的工作与预期的一样,但不使用默认的forkjoin公共池(1个答案)
34分钟前关闭。
在以下代码中,
class MainX {
static void run(int i) {
try {
System.out.println(i + " called");
Thread.sleep(1000);
String s = "";
for (int j = 0; j < 20000; j++) {
s = s + j;
}
System.out.println(i + " completed" + " " + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
int p = i;
executorService.submit(() -> MainX.run(p));
}
System.out.println("all called");
executorService.shutdown();
System.out.println("all called" + " Thr:" + Thread.currentThread().getName());
}
}
(vs)
class MainX {
static void run(int i) {
try {
System.out.println(i + " called");
Thread.sleep(1000);
String s = "";
for (int j = 0; j < 20000; j++) {
s = s + j;
}
System.out.println(i + " completed" + " " + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
int p = i;
CompletableFuture.runAsync(() -> MainX.run(p));
}
}
}
在第一种情况下,jvm会一直运行,直到所有线程都完成。但在第二种情况下,jvm和其他线程在主线程死亡后立即被杀死。
有什么原因吗?
1条答案
按热度按时间lbsnaicq1#
在我看来,“completablefuture”本身不执行任何操作,因此它没有线程等待。它依赖于其他机制来运行阶段。
没有执行器的“runasync”在其公共forkjoin池中运行任务,该池被记录为具有您观察到的行为。
这并不能回答你关于“为什么”的问题,只是说它是故意这样设计的。我只能举手示意,说它的设计者可能认为它是最好的默认选择。
(我同意:在我编写的代码中,如果我达到程序终止的地步,我想要的是一切都消失。在极少数情况下,我需要完成它,我会在退出之前等待。)