Javaスレッドの待機と通知
-
05-07-2019 - |
質問
2つのスレッドがあります。スレッドAはキューからいくつかの要素をプルし、スレッドBはキューにいくつかの要素を追加しています。
キューが空のときにスレッドAをスリープさせたい。
スレッドBが何らかの要素をキューに追加するとき、スレッドAが機能していることを確認する必要があります。これをJavaでどのように行うことができますか?
解決
BlockingQueue を使用するコード>
、つまり:
要素を取得するときにキューが空にならないように待機し、要素を格納するときにキュー内のスペースが使用可能になるまで待機する操作をさらにサポートする
Queue
。
真剣に、ここで車輪を再発明しようとしないでください。
(wait / notifyを使用する必要がある場合は、このチュートリアル。ただし、苦痛を避けてください!)
他のヒント
詳細を次に示します。
import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();
これで、Javaの新しいスレッド機能がすべて揃いました。エグゼキューターは、someNumberOfThreadsを含むスレッドプールです。ブロッキングキューによって供給されます。実行する作業がない限り、すべてのスレッドはスリープします。 execute()メソッドを使用してRunnableオブジェクトをキューにプッシュすると、Runnableオブジェクトは、処理可能なスレッドができるまでキューに留まります。次に、run()メソッドが呼び出されます。最後に、shutdownNow()メソッドはプール内のすべてのスレッドにシャットダウンするよう通知します。
以前よりもずっと簡単になりました。
(これには、スレッドの最小数と最大数のプールや、execute()を呼び出すスレッドがブロックされる前に最大サイズのキューなど、さまざまなバリエーションがあります。)