紛らわしいタイトルですみません。それをどのように表現するかがよくわかりません。それが問題かもしれません!
同時スレッドが関係する状況で使用するための適切な抽象化を探しています。
近づくことはできましたが、完全に釘付けにはなりませんでした。
少し単純化すると、Android フォンで収集されている 2 種類のセンサー入力があります。方向タイプのものと WiFi スキャンです。
両方が十分に収集されたら、データを使用するイベントをトリガーしたいと考えています。ただし、ここで停止したくありません。このプロセスは N 回継続する必要があります。
最初は、条件で while ループを使用しました。
startCollecting();
while (samplesCollected < X){
// wait
while (directionCount < Y || scanCount < Z){};
// then
doSomeStuff();
samplesCollected++;
}
stopCollecting();
ただし、これはパフォーマンスが悪いと SO から言われました。実際、UI のロックアップが発生しているため (別のスレッドにある場合でも)、java.util.concurrent を使用することにしました。
問題は、おそらく私の経験不足のせいで、どの抽象化を使用するかをうまく判断できないことです。
ReentrantLock の条件:
条件のアイデアは素晴らしいようです-しかし、共有リソースを制御したい場合はそうではありません-最初のバッチが処理されている間、データ収集をバックグラウンドで続行したい-では、どこでロックを呼び出すのですか? ロックしないと、IllegalMonitorStateException がスローされます。
カウントダウンラッチ:
理想的なようです-収集スレッドがデータを利用できる場合、countDown() を呼び出すことができ、countDown が十分な回数呼び出されると、アクションを続行できます。しかし、countDown は 1 回限りの実行であると想定されており、これを数回繰り返す必要があります。
サイクリックバリア:
CountdownLatch のドキュメントでは、動作を繰り返し可能にする場合は代わりに CyclicBarrier を使用する必要があることを示唆していますが、CyclicBarrier の比喩はこの状況では完全に間違っているようで、これを使用する方法がわかりません。
以下にいくつかの関連する質問をリンクしました - ガイダンスをいただければ幸いです。