java - ExecutorService - 如何以非阻塞方式等待所有任务完成

标签 java multithreading web-applications executorservice

我在 Java 网络服务器应用程序 中使用 ExecutorService 以并行方式执行一些计算任务,然后使用 调用 shutdown() >awaitTermination() 等待所有任务完成。整个计算有时可能需要几十分钟。

问题是 awaitTermination() 方法会阻塞主线程,直到超时(或中断),但我只想开始任务并立即响应 到客户端,在所有任务完成后关闭服务(遵循始终关闭线程池的惯例)。

所以我的问题是,有什么方法可以在所有任务完成时收到通知,以便我可以调用 shutdown() 方法?听众什么的..

谢谢!

最佳答案

您正在尝试解决一个不存在的问题。考虑 documentation of ExecutorService.shutdown() :

Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. …

This method does not wait for previously submitted tasks to complete execution.

换句话说,只需调用 shutdown() 就可以完成您想要的一切

  • 它完成了之前提交的所有任务
  • 它启动关闭
  • 它不等待

唯一的障碍是尽管您不想等待,但您仍在调用 awaitTermination,这有一个简单的解决方案:不要调用 等待终止

出现混淆是因为在您的问题中您问的是“当所有任务完成后如何通知我以便我可以调用 shutdown() 方法”但这与您的意思相矛盾实际上在代码中做。您正在调用 awaitTermination after shutDown 因此您不是在等待启动关机,而是启动 shutdown first and waiting its completion then,这就是awaitTermination的目的,等待关闭的完成


一言以蔽之,提交后调用shutDown,以便在所有提交的作业完成后关闭服务,不要调用awaitTermination,除非你真的想等待终止。

关于java - ExecutorService - 如何以非阻塞方式等待所有任务完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30805423/

相关文章:

java - 在 JSF+Facelets 中迭代 HashMap.values()

java - 如何停止网络 I/O 的线程阻塞?

c# - Type.GetType() 返回 null

web-applications - "Add to Home Screen"的标准

javascript - 如何创建自动化应用程序导览/演练?

java - BootstrapClassLoader 未在委托(delegate)模型中加载

java - activeMq tcp 故障转移时如何处理连接失败

java - UCanAccess异常: cannot getMetaData from ResultSet (invalid cursor state)

java - 如何使用 twitter4j 构建可靠的多线程 twitter api 查询应用程序?

java - 为什么ThreadLocal的initialValue不会增加我的变量?