7

我需要能够更改ThreadPoolExecutor的任务队列的大小。当然,BlockingQueue 不支持改变大小,ThreadPoolExecutor 也不支持改变队列。

所以,我想出的方法是使用ThreadPoolExecutor.shutdownNow(),它会返回一个尚未执行的 Runnables 列表。然后我可以创建一个具有所需队列大小的新执行器并重新提交所有任务。

问题在于调用 shutdownNow() 时正在进行的任务。据我从 javadoc 中得知,执行程序将在当前执行任务的所有线程上调用 Thread.interrupt() 。我不希望我的任务被杀死。这个问题可能是询问如何编写我的任务以使 Thread.interrupt() 不会产生任何影响的冗长方式?

4

2 回答 2

3

混合使用“shutdown()”(不是 shutdownNow()),然后使用 getPoolSize()/isTerminated() 进行轮询,您可以 (a) 停止现有的 pool 。然后(b)同时(在一个单独的线程中)可以创建一个具有所需大小的新队列。您将在以下方面进行权衡:您是否允许暂时存在比所需数量更多的线程(当第一个池正在关闭时)。

于 2013-03-02T14:46:23.870 回答
0

您应该使用 isTerminated() 方法检查 Executor 状态,但请确保在调用 isTerminated 方法之前您应该调用 shutdown() 否则 isTermainated 方法 aleays 返回 false。

于 2013-03-02T14:56:06.353 回答