当前位置: 首页 > 面试题库 >

完成所有ExecutorService任务后,程序不会立即终止

卞坚成
2023-03-14
问题内容

我将一堆可运行的对象放入ExecutorService中:

// simplified content of main method
ExecutorService threadPool = Executors.newCachedThreadPool();
for(int i = 0; i < workerCount; i++) {
    threadPool.execute(new Worker());
}

我希望我的程序/过程在所有工作人员完成后立即停止。但是根据我的日志,这种情况还需要20到30秒。工人没有分配任何资源,实际上,他们目前什么都不做。

不要误会我的意思,这对我来说不是一个关键问题,我只是想了解正在发生的事情,而且我想知道这是否是正常行为。


问题答案:

Executors.newCachedThreadPool()使用Executors.defaultThreadFactory()它的ThreadFactorydefaultThreadFactoryjavadocs说“每个新线程都被创建
为非守护
线程”(添加了重点)。因此,为所创建的线程newCachedThreadPool是非守护程序。这意味着它们将阻止JVM自然退出(通过“自然”,我是说您仍然可以调用System.exit(1)或杀死该程序以使JVM停止运行)。

应用程序完全结束的原因是,在newCachedThreadPool超时时间内创建的每个线程都会在一段时间不活动后自行关闭。当它们中的最后一个关闭时,如果您的应用程序中没有剩余的非守护线程,则它将退出。

您可以(并且应该)ExecutorService通过shutdown或手动关闭下拉菜单shutdownNow

另请参阅JavaDoc for
Thread,它讨论守护程序。



 类似资料:
  • 问题内容: 我有一个代码,其中4个线程同时运行。我想等到所有这4个线程都结束。并且只有在那之后才能继续应用程序流程。 我尝试了两种方法: ,这种方法可以正常工作。之后的代码仅在所有线程完成后才执行。 ,此技术允许执行代码,即使并非所有线程都已完成,也可以执行代码。 代码示例: 我的问题: 为什么并且不要等到所有线程都完成并打印出来 _«我们完成了! 所有线程都完成了!» _刚打完电话? 问题答案:

  • 我有一个4个线程同时运行的代码。我想等到所有这4个线程都完成。并且只有在那之后才能继续应用程序流程。 我尝试了两种方法: ,此方法按预期工作。 之后出现的代码仅在所有线程完成后执行。 ,这种技术允许执行代码,即使不是所有线程都已完成,也会在 之后执行。 代码示例: 我的问题: 为什么 和 不要等到所有线程都完成并打印 “我们完成了!所有线程都已完成!» 在调用 ?

  • 我有以下问题: 我正在使用Spring MVC 4.0.5和Hibernate 4.3.5,我正在尝试创建一个Restfull Web应用程序。问题是,我想排除某些字段,使其无法序列化为 JSON,具体取决于使用方面在控制器中调用的方法。 我现在的问题是Hibrate不会在事务从方法返回后立即提交事务,而只是在序列化之前提交。 Controller.java Service.java 方面的建议执

  • 我正在用Java编写一个应用程序,它使用ExecutorService来运行多个线程。 我希望将多个任务(一次数千个)作为调用项提交给执行器,完成后,检索它们的结果。我处理这个问题的方式是,每次调用submit()函数时,都会得到一个Future(未来),并将其存储在ArrayList中。稍后,我将列表传递给一个线程,该线程不断对其进行迭代,调用future.get()函数并给出一个超时时间,以查

  • 问题内容: 我是python和线程的新手。我已经编写了充当网络爬虫的python代码,并在网站中搜索特定的关键字。我的问题是,如何使用线程同时运行类的三个不同实例。当实例之一找到关键字时,所有三个实例都必须关闭并停止爬网。这是一些代码。 如何使用线程让Crawler同时执行三个不同的爬网? 问题答案: 似乎没有一种(简单的)方法可以终止Python中的线程。 这是一个并行运行多个HTTP请求的简单

  • 问题内容: 因此,我一直在尝试Gulp,看看它在速度上与Grunt相比如何,我对结果印象深刻,但是我有一件事我不知道如何在Gulp中进行。 因此,我有这个任务来缩小HTML: buildMetaData对象具有我需要的自定义功能,以及为什么不能使用像gulp- changed这样的插件。我要弄清楚的是,在缩小完成后如何(如果可能)运行代码块来处理所有文件并成功运行。gulp有可能发生这种情况吗?