単一のスレッドが並行して実行できる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());
そして、それは私が達成したい効果をいくらか達成しますが、エレガントではありません(基本的に拒否されたスレッドは呼び出しスレッドで実行されるため、呼び出しスレッドがそれ以上送信するのをブロックします)。
編集:(質問をしてから5年後)
この質問とその回答を読んでいる人には、受け入れられた回答を1つの正しい解決策と見なさないでください。すべての回答とコメントをお読みください。