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

回到顶部