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