- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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/
我是一名优秀的程序员,十分优秀!