web-dev-qa-db-ja.com

スレッドプールがスレッドを再利用する方法とその仕組み

私のマルチスレッドの概念は弱く、学習しようとしています。

Java私が知っていることは、私たちは一度以上スレッドを呼び出すことはできません

_Thread t = new Thread(//Some Runnable);
t.start()

t.start() //Illegal and throw Exception at Runtime.
_

私の知る限り、t.start()を再度呼び出すと例外がスローされます。スレッドに関連付けられたスタックがrun()メソッドから出ると破棄され、再度初期化しようとしているためです。

その場合、Threadpoolについて知っていることは、新しいスレッドを作成する必要がないため、パフォーマンスが向上し、時間を節約できることです。 (私は http://www.javatpoint.com/thread-pooling-in-Java を読みました)

threadPoolシナリオで新しいスレッドを作成する必要がない場合、runメソッドを完了したばかりの同じスレッドでどのように動作するか、そのスレッドは再び使用できますか?

私はこれを読みます http://docs.Oracle.com/javase/tutorial/essential/concurrency/pools.html そしてそれは「エグゼキューターのほとんどJava.util.concurrentの実装は、ワーカースレッドで構成されるスレッドプールを使用します。この種のスレッドは、実行されるRunnableおよびCallableタスクとは別に存在し、複数のタスクを実行するためによく使用されます。

ここでワーカースレッドとは、通常のJava Threads?

このリンクで キャッシュされたスレッドプールは既存のスレッドをどのように再利用するか スレッドプールを使用すると、どのようなものを排除できるかについて、まだ混乱しています。通常のJavaスレッド。

このように言えますか

スレッドには3つの部分があり、

  1. 作成(新しいスレッドであることをOSに伝え、そのためのスタックを作成します。)
  2. Runnable、つまりrun()メソッドを実行します。
  3. スレッドの破棄。

したがって、上記の3つのステップを考慮して、スレッドプールを使用すると、一定数のスレッド作成後にステップ1とステップ3を削除できます。各タスクのステップ2のみが実行されるため、Threadpoolの方が高速ですか?このように言えますか?私は正しいですか?

41
Jayesh

ThreadPoolシナリオで新しいスレッドを作成する必要がない場合、runメソッドを終了したばかりの同じスレッドでどのように動作するか、そのスレッドは再び使用できますか?

シンプル-元のスレッドは実際には完了しません。別のタスクが実行されるのを待つだけです。擬似コード内:

// No, this isn't even slightly accurate! General impression only :)
while (!pool.isShutdown()) {
    Runnable task = pool.waitForTaskOnQueue();
    task.run();
}

(明らかに、スレッドプールがシャットダウンされると、待機中のスレッドが別のタスクを待機するのを停止する必要があります-しかし、うまくいけば一般的なアイデアが得られます。)

32
Jon Skeet

スレッドプール内スレッドプールは、新しいタスクが到着したときに新しいスレッドを作成する代わりに、必要に応じてタスクを実行する準備ができている多数のアイドルスレッドを保持します。スレッドはタスクの実行を完了した後、死ぬことはありません。代わりに、新しいタスクを実行するために選択されるのを待機しているプールでアイドル状態のままです。

プール内の同時スレッドの数を制限できます。これは、過負荷を防ぐのに役立ちます。すべてのスレッドがタスクを忙しく実行している場合、新しいタスクはキューに配置され、スレッドを待機できるようになります

2
Vinayak Bansal

このプロセスは2つの部分で機能します。

タスクの送信:スレッドプールはブロッキングキューと密接に結合されています。 executor.execute(runnable)と言うとき。実行可能/呼び出し可能はキューに入れられます。

タスクの実行:ここで、タスクをキューからピックアップする必要があります。キューでタスクが送信されるたびに、タスクをピックアップして実行する必要があるとしましょう。

そのため、無限ループを実行し、タスクのキューを監視するスレッドがあります。タスクが使用可能になるとすぐに、1つのスレッドがタスクを選択して実行します。

2
Sonu

したがって、上記の3つのステップを考慮して、スレッドプールを使用すると、一定数のスレッド作成後にステップ1とステップ3を削除できます。各タスクのステップ2のみが実行されるため、Threadpoolの方が高速ですか?このように言えますか?私は正しいですか?

はい。それで合っています。スレッドの作成と破棄は、コストのかかるタスクの1つです。スレッドプールのように、スレッドはすでに作成されているため、スレッド作成のオーバーヘッドはありません。ただし、必要以上に多くのスレッドがある場合、アプリケーションにとってはかなり悪いでしょう。 OutofMemorryになるか、他の問題が発生する可能性があります。そのため、スレッドプールのサイズを修正するには、次の式を使用します。

no of threads = 2 * no_of_cores * no_of_disks * percentage CPU utilization you need * (1 + (W/ C))

(W/C)は、計算時間に対する待機時間を示す割合です。

1
Trying