0

さらにwait/notify、スレッド間でイベントを通知するよりクリーンな方法はありますか?たとえば、何かが発生したことを通知し
たい場合、並行パッケージにこれを上に構築するよりも優れた構成がありますか? 私の要件は単純です 。イベントが発生することを期待しています。そのような変更を検出する責任があります。変更が発生すると通知しますThread XThreadYwait/notify
ThreadBThreadAThreadAThreadB

更新:
Observer / Observableパターンを実行する必要がありますが、ループを介してオブザーバーに通知するときに、オブザーバブルがブロックするのをできるだけ少なくしたいと思います。
つまり、オブザーバブルは別々のスレッドになり、火災時のオブザーバブルの変化は、ブロックをできるだけ少なくするようにそれらに「通知」します。

4

6 に答える 6

0

待機/通知で書かないでください。java.concurrentutilsを使用します。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/package-summary.html

例として、バインドされていないキューが要件に適している場合は、ConcurrentLinkedQueueを使用します:http: //docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html

ところで、最良のオプションは、代わりに先物とアクターを使用してスレッドを手動で管理することをまったく避けることです。

于 2013-02-26T13:27:29.680 に答える
0

ExecutorServiceを使用できます。これは、終了を管理するメソッドと、1つ以上の非同期タスクの進行状況を追跡するためのFutureを生成できるメソッドを提供するExecutorから拡張され ています。これは、スレッド間通信で説明したような状況での使用が非常に簡単です。

于 2013-02-26T13:34:34.567 に答える
0

残念ながら、あなたはまだあなたの要件に曖昧です。上位レベルでの通知に使用できる3つの主要な並行プリミティブがあり、次に待機/通知および待機/信号を送信します。

スレッドの完了を待機するバリア、別のスレッドからのメッセージを待機するバリア、またはイベントで複数のスレッドを待機するバリアを設定できます。

最も遠い場合は、、またはを使用CyclicBarrierできCountdownLatchますPhaser

2つ目は、、、、またはのいずれLinkedBlockingQueueであっても、任意のBlockingQueueを使用できます。ArrayBlockingQueueSynchronousQueueTransferQueue

ExecutorServiceそして最後に、 +を使用できますFuture

次の問題:

イベントとは正確には何であり、何が変化していますか?これは重要です。フィールドが変更されている場合は、 SettableFutureを使用してフィールド/イベントの更新を元に戻すことができます。

編集:

新しいライブラリを含めることはできますか。Akkaはあなたのためにうまくいくようです。

于 2013-02-26T13:38:52.990 に答える
0

java.util.concurrent.locksパッケージクラスLock、Conditionなどは、スレッドの調整をより細かく制御できます。

于 2013-02-26T13:39:53.223 に答える
0

オブザーバーをブロックしたくない場合(他のタスクで忙しいため)、何らかのポーリングメカニズムを実装する必要があります。他のスレッドには独自のシーケンシャルロジックがあるため、ブロックされていない別のスレッドのメソッドを魔法のように呼び出すことはできません。

最も簡単なポーリングソリューションは、揮発性変数を特別な値に設定し、オブザーバースレッドからその変数を定期的にチェックすることです。

于 2013-02-26T15:26:21.660 に答える
0

複雑なデータ構造を導入せず、スレッドに通知するだけの場合は、スレッドの割り込みを確認することもできます。コンシューマースレッドはループ内で実行され、中断されると処理を実行してから、ループを終了/実行します。

于 2014-08-27T10:08:44.210 に答える