52

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

私が知っている Java では、スレッドを複数回呼び出すことはできません。

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

t.start(); //Illegal and throw Exception at runtime.

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

その場合、スレッドプールについて私が知っていることは、新しいスレッドを作成する必要がないため、パフォーマンスが向上し、時間を節約できるということです (私はこれを読みまし)。

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

これを読んだところ、「java.util.concurrent のエグゼキュータ実装のほとんどは、ワーカー スレッドで構成されるスレッド プールを使用しています。この種のスレッドは、実行する Runnable および Callable タスクとは別に存在し、多くの場合、実行に使用されます。複数のタスク。

では、ここでのワーカー スレッドとは何ですか。通常の Java スレッドとは異なるものですか?

このリンクで、私は何かを得ましたが、スレッドプールを使用するときにどのようなものを排除できるか、および通常の Java スレッドを使用するよりもパフォーマンスが向上する理由についてまだ混乱しています。

では、次のように言えますか。

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

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

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

4

4 に答える 4

39

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

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

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

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

于 2013-11-04T10:37:54.190 に答える
2

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

プール内の同時スレッド数を明確に制限できます。これは、過負荷を防ぐのに役立ちます。すべてのスレッドが忙しくタスクを実行している場合、新しいタスクはキューに入れられ、スレッドが使用可能になるのを待ちます

于 2017-07-19T04:26:02.827 に答える