質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top