Java:ExecutorService在特定队列大小后会在提交时阻止
我正在尝试编写一个解决方案,其中单个线程会生成可并行执行的I / O密集型任务。每个任务都有重要的内存数据。因此,我希望能够限制当前待处理的任务数。
如果我这样创建ThreadPoolExecutor:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
然后,当队列已满并且所有线程都已经繁忙时,executor.submit(callable)
抛出该异常RejectedExecutionException
。
executor.submit(callable)
当队列已满并且所有线程都忙时,我该怎么做才能阻塞?
:我试过了:
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
它以某种微妙的方式达到了我想要达到的效果(基本上被拒绝的线程在调用线程中运行,因此这阻止了调用线程提交更多信息)。
对于阅读此问题及其答案的任何人,请勿将接受的答案作为一种正确的解决方案。请通读所有答案和评论。
回答:
我也做过同样的事情。诀窍是创建一个BlockingQueue,其中offer()方法实际上是put()。(您可以使用所需的任何基本BlockingQueue隐式表示形式)。
public class LimitedQueue<E> extends LinkedBlockingQueue<E> {
public LimitedQueue(int maxSize)
{
super(maxSize);
}
@Override
public boolean offer(E e)
{
// turn offer() and add() into a blocking calls (unless interrupted)
try {
put(e);
return true;
} catch(InterruptedException ie) {
Thread.currentThread().interrupt();
}
return false;
}
}
请注意,这仅适用于线程池,corePoolSize==maxPoolSize
因此请注意此处(请参见注释)。
以上是 Java:ExecutorService在特定队列大小后会在提交时阻止 的全部内容, 来源链接: utcz.com/qa/410553.html