10

私は2つのスレッドを持っています。スレッドAはキューからいくつかの要素をプルし、スレッドBはキューにいくつかの要素を追加しています。

キューが空のときにスレッドAをスリープ状態にしたい。

スレッドBがキューに要素を追加するときは、スレッドAが機能していることを確認する必要があります。これはJavaでどのように行うことができますか?

4

2 に答える 2

21

を使用しますBlockingQueue。これは次のとおりです。

Queue要素を取得するときにキューが空でなくなるのを待ち、要素を格納するときにキューでスペースが使用可能になるのを待つ操作を追加でサポートするA。

真剣に、ここで車輪の再発明を試みないでください。




(待機/通知を使用する必要がある場合は、このチュートリアルをお読みください。ただし、苦痛を避けてください!)

于 2009-05-05T18:04:13.093 に答える
2

詳細は次のとおりです。

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()を呼び出すスレッドがブロックする前に最大サイズのキューなど、さまざまなバリエーションがあります。)

于 2009-05-05T18:52:52.273 に答える