首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在所有线程完成之前从java方法返回

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

Stack Overflow用户
提问于 2018-10-29 08:08:31
回答 1查看 101关注 0票数 3

在所有线程完成之前启动线程的java方法有可能返回吗?

下面是我的代码:

代码语言:javascript
复制
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;
    }
}

这个不能返回的原因我不明白。为什么主线程的返回会受到工作线程被卡住的影响?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-29 08:20:45

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

代码语言:javascript
复制
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
  • Use shutdownNow()。这将在每个正在运行的线程上发送一个中断。您仍然需要在每个线程上进行检查,要么调用抛出InterruptedException的方法,要么显式调用Thread.currentThread().isInterrupted().

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53037206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档