私は、複数のスレッドを持つプログラムを書いています。そのプログラムの中で 私はしばしばwaitとnotifyを使って、あるスレッドが他のスレッドが起動するまで待つようにします。Javaのスレッドを2つのスレッドから通知を受け取るようにするには?
私の想像上のプロジェクトでは、私は3つのスレッドがあると言うことができます:m、aとb。 mはメインです。 mスレッドはスレッドを開始し、bスレッドを開始します。 mスレッドはあるスレッドがそのジョブで完了するのを待つべきです(死ぬことはしません)。もし完了すれば、目覚めて一つのことをしなければならない。 bが完了すれば、目覚めて別のことをするべきです。このような
と何かを::
私がmでこのようなものを使用することができ、私はBを待ちたい場合
synchronized(this)
{
notify();
}
同じことが行きます。
synchronized(this)
{
notify();
}
しかし、私はそれらの両方を待ちたい場合、私はこのようなコード必要があります:
Bでsynchronized(b)
{
b.wait();
}
:メートルで
synchronized(a, b)
{
a,b.wait();
}
もちろんのを、これはjavaではサポートされていません。
もちろん、メインをスリープ状態(32)にしたり、そのようなものを入れて、フラグをaとbに入れたり、起きるとフラグをチェックしたり、どちらが終了したかを知ることができます。 しかし、私はwait-notifyアプローチを使って、aとbのフラグを常にチェックすることを避けたかったのです。
だから、解決策は何ですか? 何か方法がありますが、フラグが常にチェックされている以外、mからaまたはbが終了した(死んでいない)ことがわかりましたか?
あなたの説明はちょっと混乱します。 'm'は' a'と 'b'が終わるのを待つか、' a'か 'b'が終わるたびに' m'に戻ってほしいですか? 'b'との継続作業や全く別の作業をしている作品は? – Esko
はい、mはaまたはbのいずれかを待つ必要があります。 aとbは多段階の仕事をしています。 1つのステージで終了するたびに、それをmに通知したい。 1つのステージでbが終了すると、mにも通知する必要があります。 mがmに通知すると、mは "a notified me"と、bがmに通知すると、mは "b通知された"と書かれたようなことをする必要があります。 –