更改ThreadPoolExecutor的队列大小

时间:2013-02-28 23:28:55

标签: java multithreading threadpool

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

你应该使用isTerminated()方法来检查Executor状态但是在调用isTerminated方法之前你应该调用shutdown(),否则isTermainated方法会返回false。