私は、wait() と notify() を使用して、スレッド通信に関する問題を解決しようとしています。基本的に、T1とT2の2つのスレッドがあり、次の順序で実行したい
T1、T2、T1、T2 .....どうすればそれを達成できますか?
実際の問題: 2 つのスレッド T1 - 奇数 (たとえば 1 - 100) を出力するスレッドと T2 - 偶数 (1 - 100) を出力するスレッドがあります。これで、出力は 1, 2, 3, 4 , 5 , .... 100 になります。
私は、wait() と notify() を使用して、スレッド通信に関する問題を解決しようとしています。基本的に、T1とT2の2つのスレッドがあり、次の順序で実行したい
T1、T2、T1、T2 .....どうすればそれを達成できますか?
実際の問題: 2 つのスレッド T1 - 奇数 (たとえば 1 - 100) を出力するスレッドと T2 - 偶数 (1 - 100) を出力するスレッドがあります。これで、出力は 1, 2, 3, 4 , 5 , .... 100 になります。
Producer-Consumer パターンを記述します。
これは、Naughton と Schildt による M.Grand の「Patterns in Java. Volume I」や「Java 2: The Complete Reference」など、多数の Java 書籍で説明されている Java 実装です。
基本的な考え方: 両方のスレッドが 1 つのモニターを使用する必要があります (つまり、それらのコードはsynchronized(monitor) {}
ブロック内にある必要があります)。また、現時点で 2 つのスレッドのどちらが動作するかを示すフラグ変数も必要です。
スレッドの 1 つが同期ブロック内にある場合、ジョブを実行する番であるかどうかをフラグ変数で確認する必要があります。はいの場合は、動作させてからフラグ値を変更し、待機中のすべてのスレッドに通知します。いいえの場合は、待つ必要があります。
java.util.concurrent パッケージ、特にExchangerを見てください。
多段階のプロセスを並列化しようとしていますよね? もしそうなら、アプローチとそれを行うためのいくつかの実用的なコードについては、私の答えhereを参照してください。その答えには、ExecutorService
1 つ (または 2 つ) および 1 つ以上の作業キューが含まれます。
このアプローチでは、処理の中間状態情報とともに、処理が Runnable に適合できる必要があります。 各ステップをとしてフィードすると、次のステップを実行するための 2 番目の Runnable が追加されます。ExecutorService
Runnable
これにより、実行順序が維持されますが、必要な数のスレッドを並行して効果的に実行できます。
:編集:
別の人が示唆しているように、処理を2つのスレッドに明示的に制限したい場合は、これにExchangerライブラリクラスを使用できます。実行順序が維持され、最新の 4 コア (および 8 コア) システムを完全に使用できるため、私は上記のアプローチを好みます。また、同期を少し減らす必要があります。