没有队列的ThreadPoolExecutor

时间:2012-04-17 06:42:06

标签: java queue threadpool

我想创建一个固定大小的线程池,不允许任何任务进入其队列。换句话说,如果当前正在使用线程池,则应彻底拒绝传入任务。基于documentation,在我看来,实现此目的的一种方法是创建一个拒绝接受任务的虚拟Queue对象。在Java中实现这一目标的惯用方法是什么?

3 个答案:

答案 0 :(得分:11)

您可以在ThreadPoolExector中使用SynchronousQueue,这是一个不包含任何对象的队列。缓存的线程池使用它,因为它根据需要创建新线程。

如果它不能排队,但我建议使用RejectedExecutionHandler在当前线程中运行任务。这样它将始终“立即”运行。

顺便说一句:明确你为什么要这样做会很有用。

答案 1 :(得分:0)

你能详细说明你为什么要这样做吗? TP + Q的根本目的是为工作提供自动“保持机制”,并将工人与工作创建过程分离。如果你的意图是只有工人可接受的工作包,那么你真的不需要TPE。

答案 2 :(得分:0)

  

我想创建一个固定大小的线程池,该线程池不允许任何任务进入其队列。

为了后代,如果您需要一个没有队列的线程池并且确实运行了所有作业(与OP稍有不同),则可以使用{{1} }将会阻塞,直到有线程准备就绪为止。诀窍是使用SynchronousQueue来调用将阻塞的队列上的RejectedExecutionHandler

put(...)

您将能够提交作业,直到达到threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, new SynchronousQueue<Runnable>(), new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor){ try { // this needs to be put(...) and not add(...) executor.getQueue().put(runnable); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); 个线程数为止,然后提交将被阻塞,直到作业完成并且有一个线程可从maximumPoolSize出队。 / p>