2

Java の並行処理について頭を悩ませようとしているのですが、スレッド プール、スレッド、およびそれらが実行している実行可能な「タスク」の間の関係を理解するのに苦労しています。

たとえば、10 個のスレッドを含むスレッド プールを作成した場合、プール内の各スレッドに同じタスクを渡す必要がありますか、それともプールされたスレッドは、文字通りタスクに依存しない「ワーカー ドローン」であり、任意のタスクを実行できますか?

いずれにせよ、Executor/ExecutorService はどのようにして適切なタスクを適切なスレッドに割り当てるのでしょうか?

4

2 に答える 2

7

通常、スレッド プールは、すべてのプール スレッドがタスクを待機する 1 つのプロデューサー/コンシューマー キューで実装されます。Executor はタスクを割り当てる必要はなく、タスクをキューにプッシュするだけです。「タスクに依存しないワーカー ドローン」である一部のスレッドは、タスクをポップし、その「run()」メソッドを実行し、完了すると、ループ ラウンドを実行して、キューで再び次の作業を待ちます。

于 2012-04-30T01:07:52.190 に答える
2

たとえば、10 個のスレッドを含むスレッド プールを作成した場合、プール内の各スレッドに同じタスクを渡す必要がありますか、それともプールされたスレッドは、文字通りタスクに依存しない「ワーカー ドローン」であり、任意のタスクを実行できますか?

多かれ少なかれ後者です。特定のタスクは、次に使用可能なスレッドに割り当てられます。

いずれにせよ、Executor/ExecutorService はどのようにして適切なタスクを適切なスレッドに割り当てるのでしょうか?

「正しい」スレッドなどというものはありません。タスク (つまりRunnable) は、どのスレッドがそれを実行しても問題にならないように設計する必要があります。これは通常は問題になりません...アプリケーションが、複数のスレッドで使用される可能性のあるデータへのアクセス/更新を適切に同期すると仮定します。

于 2012-04-30T04:58:50.887 に答える