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