我在 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/