処理する必要があるデータが多すぎる場合、ThreadPoolExecutor コマンドを待機させるにはどうすればよいですか?
無制限のキューの代わりにBlockingQueue
、制限付きのを使用できます。
BlockingQueue<Date> queue = new ArrayBlockingQueue<Date>(200);
に送信されるジョブに関しては、 を使用して作成されExecutorService
たデフォルトの を使用する代わりに、無制限のキューを使用して、独自のジョブを作成できます。ExecutorService
Executors
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);
// by default (unfortunately) the ThreadPoolExecutor will throw an exception
// when you submit the 201st job, to have it block you do:
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// this will block if the queue is full
executor.getQueue().put(r);
// check afterwards and throw if pool shutdown
if (executor.isShutdown()) {
throw new RejectedExecutionException(
"Task " + r + " rejected from " + e);
}
}
});
Java にThreadPoolExecutor.CallerBlocksPolicy
.