gpt4 book ai didi

java - 在所有线程完成之前从 java 方法返回

转载 作者:搜寻专家 更新时间:2023-11-01 02:19:22 26 4
gpt4 key购买 nike

是否可以从在所有线程完成之前启动线程的 java 方法返回?

这是我的代码:

import java.util.concurrent.*;

public class ExecutorSample {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
service.execute(() -> {
while (true) {
}
});
}
return;
}
}

由于某种我不明白的原因,它没有返回。为什么主线程的返回会因为工作线程被卡住而受到影响?

最佳答案

您的 main 方法正在返回,但问题是您的 JVM 没有退出。您可以通过将 main 方法重命名为其他名称来测试它,例如 doMain(),然后将 main 编写为:

public static void main(String[] args) {
doMain();
System.out.printf("here");
}

你会看到你确实得到了输出,但程序并没有结束。

发生的事情是 Executors.newCachedThreadPool 使用 default thread factory ,它创建非守护线程。当您的 main 方法返回时,JVM 将等待所有非守护线程完成(这就是它们与守护线程的区别——JVM 不会等待那些线程)。由于您所有的 Runnable 都会永远运行,非守护线程永远不会结束,JVM 也永远不会退出。

你能做什么?一些选项:

  • 使用重载newCachedThreadPool(ThreadFactory) , 提供创建守护线程的 ThreadFactory
  • 使用shutdownNow()在你的 ExecutorService 上。这将在每个正在运行的线程上发送一个中断。您仍然需要在每个线程上检查它,方法是调用抛出 InterruptedException 的方法或显式调用 Thread.currentThread().isInterrupted()

对于 shutdownNow 方法,请注意单独中断一个线程不足以停止它——在该线程上运行的代码必须通过检查它的中断状态(使用这两种方法之一)并适当退出。例如,您可以将 while(true) 替换为 while (!Thread.currentThread().isInterrupted())

关于java - 在所有线程完成之前从 java 方法返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53037206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com