在所有线程完成之前启动线程的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;
}
}
这个不能返回的原因我不明白。为什么主线程的返回会受到工作线程被卡住的影响?
发布于 2018-10-29 08:20:45
您的main
方法正在返回,但问题是您的JVM没有退出。您可以通过将main
方法重命名为其他名称(如doMain()
),然后将main
编写为:
public static void main(String[] args) {
doMain();
System.out.printf("here");
}
您将看到确实获得了输出,但程序并未结束。
Executors.newCachedThreadPool
使用的是default thread factory,它创建了非守护进程线程。当main
方法返回时,JVM将等待所有非守护进程线程完成(这就是它们与守护进程线程的不同之处-- JVM不会等待这些线程)。由于所有的Runnables永远运行,非守护进程线程永远不会结束,JVM也永远不会退出。
你能做什么?一些选项:
newCachedThreadPool(ThreadFactory)
,提供一个在ExecutorService上创建守护线程的ThreadFactory shutdownNow()
。这将在每个正在运行的线程上发送一个中断。您仍然需要在每个线程上进行检查,要么调用抛出InterruptedException
的方法,要么显式调用Thread.currentThread().isInterrupted()
.对于shutdownNow
方法,请注意,中断线程本身并不足以停止它--运行在该线程上的代码必须通过检查线程的中断状态(使用这两种方法之一)并适当地退出来进行协作。例如,您可以用while (!Thread.currentThread().isInterrupted())
替换while(true)
。
https://stackoverflow.com/questions/53037206
复制相似问题