我正在使用ExecutorService(ThreadPoolExecutor)来运行(和排队)大量任务。我试图编写一些尽可能优雅的关闭代码。
ExecutorService有两种关闭方式:
- 我可以调用
ExecutorService.shutdown()
,然后调用ExecutorService.awaitTermination(...)
。 - 我可以调用
ExecutorService.shutdownNow()
。
根据JavaDoc,shutdown
命令:
Initiates an orderly shutdown in which previously submitted
tasks are executed, but no new tasks will be accepted.
而且还有shutdownNow
命令:
Attempts to stop all actively executing tasks, halts the
processing of waiting tasks, and returns a list of the tasks that were
awaiting execution.
我希望介于这两种选项之间。
我想调用一个命令,它:
a. 完成当前活动的任务或任务(例如shutdown
)。
b. 停止等待任务的处理(例如shutdownNow
)。
例如:假设我有一个具有3个线程的ThreadPoolExecutor。 它当前在队列中有50个任务,其中前3个正在运行。 我想允许这3个活动任务完成,但我不希望剩下的47个任务开始。
我认为我可以通过保持Future
对象列表的方式以这种方式关闭ExecutorService,然后在所有这些对象上调用cancel
。 但由于从多个线程向此ExecutorService提交任务,因此没有干净的方法来实现这一点。
我真的希望我错过了一些明显的东西,或者有一种清洁的方法来做到这一点。
谢谢任何帮助。