作成できるスレッドの数に制限を設けて、キャッシュされたスレッドプールを作成することは不可能のようです。
静的なExecutors.newCachedThreadPoolが標準Javaライブラリにどのように実装されているかを次に示します。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
したがって、そのテンプレートを使用して、固定サイズのキャッシュされたスレッドプールを作成します。
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
これを使用して3つのタスクを送信すると、すべてが正常になります。さらにタスクを送信すると、拒否された実行例外が発生します。
これを試す:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
すべてのスレッドが順次実行されます。つまり、スレッドプールがタスクを処理するために複数のスレッドを作成することはありません。
これはThreadPoolExecutorの実行メソッドのバグですか?または、これは意図的なものですか?または他の方法がありますか?
編集:私はキャッシュされたスレッドプールとまったく同じものを求めます(オンデマンドでスレッドを作成し、タイムアウト後にそれらを強制終了します)が、作成できるスレッドの数に制限があり、追加のタスクをキューに入れ続けることができますスレッドの制限に達しました。sjleeの回答によると、これは不可能です。ThreadPoolExecutorのexecute()メソッドを見ると、実際には不可能です。SwingWorkerと同じようにThreadPoolExecutorをサブクラス化してexecute()をオーバーライドする必要がありますが、SwingWorkerがそのexecute()で行うことは完全なハックです。