如果线程池需要处理的数据太多,我该如何让ThreadPoolExecutor等待呢?
你可以使用一个有限制的 BlockingQueue
,而不是一个开放式队列:
BlockingQueue<Date> queue = new ArrayBlockingQueue<Date>(200)
关于提交给ExecutorService
的作业,可以创建自己的ExecutorService
而不是使用使用无界队列的Executors
创建的默认ExecutorService
:
return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(200));
当队列填满时,它将拒绝任何新提交的任务。您需要设置一个RejectedExecutionHandler
将其提交到队列。例如:
final BlockingQueue queue = new ArrayBlockingQueue<Runnable>(200);
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS, queue);
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
executor.getQueue().put(r);
if (executor.isShutdown()) {
throw new RejectedExecutionException(
"Task " + r + " rejected from " + e);
}
}
});
我认为Java没有ThreadPoolExecutor.CallerBlocksPolicy
是一个重大的缺失。
BlockingQueue
@learningJava 上使用put()
,那么是的,如果队列已满,则会阻塞,直到队列大小减小后才会继续。 - Grayr.run();
- Peter Lawrey