1

スレッドプールがある場合:

ExecutorService e = Executors.newFixedThreadPool(noOfThreads);

そして、私は正確に「noOfThreads」ランナブルを開始します。別のスレッドを追加したい場合、スレッドのaadプール数を超えたことをどのようにして知ることができますか?

4

2 に答える 2

2

Executors.newFixedThreadPool()タイプのインスタンスを返しますが、ExecutorService基礎となる実装は実際にはThreadPoolExecutorクラスのインスタンスです。次のようにそのタイプにキャストできます。

ThreadPoolExecutor e = (ThreadPoolExecutor) Executors.newFixedThreadPool(noOfThreads);

次に、かどうかを確認できe.getActiveCount() == e.getMaximumPoolSize()ます。その条件が真の場合、使用可能なスレッドがないことがわかります。

ただし、一般的に、アプリケーションはこれらの種類のチェックを実行する必要はありません。これらの低レベルのスレッドプール操作は、を使用するアプリケーションのコンポーネントをExecutorServiceスレッドプールの内部から切り離す必要があるため、抽象化されています。

代わりに、アプリケーションを設計/開発するときにスレッドプールの適切な設定を決定して、スレッドが不当な時間送信キューに留まらないようにする必要があります。

編集:

コメントで提供した追加の詳細に基づいて、構築後にスレッドプールのサイズを変更する方法ThreadPoolExecutorに関するドキュメントからの追加情報を次に示します。

最も一般的には、コアと最大プールサイズは構築時にのみ設定されますが、setCorePoolSize(int)とsetMaximumPoolSize(int)を使用して動的に変更することもできます。

スレッドプールから追加のカスタム動作が必要な場合は、インスタンスを手動でインスタンス化しThreadPoolExecutorて自分で構成する方がよい場合があります。(Executorsファクトリメソッドは、有用なプリセット構成のみを提供します。)詳細については、ThreadPoolExecutorjavadocsを参照してください。

于 2012-12-15T17:55:38.427 に答える
1

演習として、これを行うことはできますが、お勧めしません。マルチスレッドは、スレッドサイズを試さずに十分に困難です。

別のスレッドが必要であることを検出する簡単な方法は、キューのサイズを確認することです。

 if(!tpe.getQueue().isEmpty()) {
     itn size = tpe.getCorePoolSize()+1;
     tpe.setCorePoolSize(size);
     tpe.setMaximumPoolSize(size);
 }
于 2012-12-15T18:38:07.533 に答える