スレッドプールがある場合:
ExecutorService e = Executors.newFixedThreadPool(noOfThreads);
そして、私は正確に「noOfThreads」ランナブルを開始します。別のスレッドを追加したい場合、スレッドのaadプール数を超えたことをどのようにして知ることができますか?
スレッドプールがある場合:
ExecutorService e = Executors.newFixedThreadPool(noOfThreads);
そして、私は正確に「noOfThreads」ランナブルを開始します。別のスレッドを追加したい場合、スレッドのaadプール数を超えたことをどのようにして知ることができますか?
Executors.newFixedThreadPool()
タイプのインスタンスを返しますが、ExecutorService
基礎となる実装は実際にはThreadPoolExecutor
クラスのインスタンスです。次のようにそのタイプにキャストできます。
ThreadPoolExecutor e = (ThreadPoolExecutor) Executors.newFixedThreadPool(noOfThreads);
次に、かどうかを確認できe.getActiveCount() == e.getMaximumPoolSize()
ます。その条件が真の場合、使用可能なスレッドがないことがわかります。
ただし、一般的に、アプリケーションはこれらの種類のチェックを実行する必要はありません。これらの低レベルのスレッドプール操作は、を使用するアプリケーションのコンポーネントをExecutorService
スレッドプールの内部から切り離す必要があるため、抽象化されています。
代わりに、アプリケーションを設計/開発するときにスレッドプールの適切な設定を決定して、スレッドが不当な時間送信キューに留まらないようにする必要があります。
編集:
コメントで提供した追加の詳細に基づいて、構築後にスレッドプールのサイズを変更する方法ThreadPoolExecutor
に関するドキュメントからの追加情報を次に示します。
最も一般的には、コアと最大プールサイズは構築時にのみ設定されますが、setCorePoolSize(int)とsetMaximumPoolSize(int)を使用して動的に変更することもできます。
スレッドプールから追加のカスタム動作が必要な場合は、インスタンスを手動でインスタンス化しThreadPoolExecutor
て自分で構成する方がよい場合があります。(Executors
ファクトリメソッドは、有用なプリセット構成のみを提供します。)詳細については、ThreadPoolExecutor
javadocsを参照してください。
演習として、これを行うことはできますが、お勧めしません。マルチスレッドは、スレッドサイズを試さずに十分に困難です。
別のスレッドが必要であることを検出する簡単な方法は、キューのサイズを確認することです。
if(!tpe.getQueue().isEmpty()) {
itn size = tpe.getCorePoolSize()+1;
tpe.setCorePoolSize(size);
tpe.setMaximumPoolSize(size);
}