作成できるスレッドの数に制限があるキャッシュされたスレッド プールを作成することは不可能のようです。
Executors.newCachedThreadPool
以下は、標準 Java ライブラリでのstatic の実装方法です。
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
?の execute メソッドのバグです。それとも、これは意図的なものですか?それとも何か他の方法がありますか?
編集:キャッシュされたスレッドプールとまったく同じものが必要です(オンデマンドでスレッドを作成し、タイムアウト後にそれらを強制終了します)が、作成できるスレッドの数に制限があり、追加のタスクをキューに入れ続ける機能が必要ですスレッド制限に達しました。sjlee の回答によると、これは不可能です。execute()
その方法を見ると、ThreadPoolExecutor
さすがに無理です。ThreadPoolExecutor
サブクラス化してオーバーライドする必要がありexecute()
ますSwingWorker
がSwingWorker
、その中で行うことexecute()
は完全なハックです。