2012-04-08 14 views
1

私はスレッドを通過していました。notify()メソッドは、同じオブジェクトの待機プールで待機しているスレッドのうちの1つだけに信号を送信するために使用されます。 メソッドnotifyAll()は、notify()と同じように動作します。このメソッドは、オブジェクトを待機しているすべてのスレッドにシグナルを送信します。スレッド処理通知

私は、スレッドが5つあり、Notify()を介してスレッド3のみに通知したいと思っている場合、その通知はスレッド3のみに送られます。 !

+0

リスト内のすべての 'Thread'オブジェクトへの参照を保持し、必要なものが見つかるまでループして、そのスレッドで' notify() 'を呼び出すことができます。 –

+0

こんにちはハンター、ありがとう、あなたは小さなコードを見せてください、それは大きな助けになるでしょう.. !!ありがとうたくさん.. !! – user1320527

+0

こんにちはハンター、驚くべき論理、それは大きな助けになる場合は、ちょうど小さなデモを表示してくださいことができれば、物事はより明確に..なります!どうもありがとう..!! – user1320527

答えて

4

waitnotifyで直接行うことはできません。どこかにフラグを設定し、スレッド内のコードにチェックを入れ、間違ったスレッドであれば待機に戻り、notifyAllに電話をかけなければなりません。

これに対処する必要がある場合、コードを再構成する必要があるかもしれないことに注意してください。個々のスレッドに通知する必要がある場合は、おそらくそれぞれが別のオブジェクトで待機するようにする必要があります。

+0

こんにちはtaymonさん、ありがとうございますが、5つのスレッド以上が待っている小さなプログラムを表示してください。notif()を使ってスレッド3のみに通知しています。大きな助け.. !!ありがとう! – user1320527

+0

こんにちはtaymonさん、ありがとうございますが、5つのスレッド以上が待っている小さなプログラムを表示してください。notif()を使ってスレッド3のみに通知しています。大きな助け.. !!ありがとう! - user1320527 10時間前 – user1320527

+0

Jiri Pateraの答えは、フラッグアプローチの例です。 – Taymon

2

wait-notifyは、イベント(予想される)が他のスレッドに示す低レベルのメカニズムです。これの例は、プロデューサ/コンシューマの仕組みです。

スレッド間で通信するメカニズムではありません。
あなたはあなたが間違った方法で探しているようなものが必要な場合。

0

次のコードは5つのスレッドを起動し、3つ目のスレッドを続行するだけであることを示すフラグを設定します。同じロックオブジェクトlockを待機しているすべてのスレッドに通知(wake-up)されますが、選択されたスレッドだけが継続します。マルチスレッドアプリケーションの作成は簡単ではありません(適切な同期、疑似ウェイクアップの処理など)。グループから特定のスレッドを1つだけ起動する必要はありません。これは、問題の分解が正しくないことを示します。とにかく、ここであなたが行く...コードの

 

package test; 

public class Main { 

    public static void main(String[] args) { 
    Main m = new Main(); 
    m.start(5); 
    } 

    private void start(int n) { 
    MyThread[] threads = new MyThread[n]; 
    for (int i = 0; i < n; i++) { 
     threads[i] = new MyThread(); 
     /* set the threads as daemon ones, so that JVM could exit while they are still running */ 
     threads[i].setDaemon(true); 
     threads[i].start(); 
    } 
    /* wait for the threads to start */ 
    try { 
     Thread.sleep(500); 
    } catch (InterruptedException ex) { 
     ex.printStackTrace(); 
    } 
    /* tell only the third thread that it is able to continue */ 
    threads[2].setCanContinue(true); 
    /* wake up all threads waiting on the 'lock', but only one of them is instructed to continue */ 
    synchronized (lock) { 
     lock.notifyAll(); 
    } 
    /* wait some time before exiting, thread two should be able to finish correctly, the others will be discarded with the end of the JVM */ 
    for (int i = 0; i < n; i++) { 
     try { 
     threads[i].join(500); 
     } catch (InterruptedException ex) { 
     ex.printStackTrace(); 
     } 
    } 
    System.out.println("Done!"); 
    } 

    /** synchronization object, i.e. a lock which makes sure that only one thread can get into "Critical Section" */ 
    private final Object lock = new Object(); 

    /** A simple thread to demonstrate the issue */ 
    private final class MyThread extends Thread { 
    private volatile boolean canContinue; 
    @Override 
    public void run() { 
     System.out.println(Thread.currentThread().getName() + " going to wait..."); 
     synchronized (lock) { 
     while (!canContinue) { 
      try { 
      lock.wait(1000); /* one second */ 
      } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
      } 
     } 
     } 
     System.out.println(Thread.currentThread().getName() + " woken up!"); 
    } 
    public void setCanContinue(boolean canContinue) { 
     this.canContinue = canContinue; 
    } 
    }; 
} 
 

出力は次のようになります。

 
Thread-0 going to wait... 
Thread-2 going to wait... 
Thread-3 going to wait... 
Thread-1 going to wait... 
Thread-4 going to wait... 
Thread-2 woken up! 
Done! 

だから、あなたは(ゼロからインデックスさ)のみ第三スレッドがウェイクアップされていることをはっきりと見ることができます。コードのすべての特定の行(たとえば、here)を理解するには、Javaの同期とマルチスレッドを詳しく調べる必要があります。

さらにお手伝いしたいと思いますが、Javaスレッドに関するほとんどの本を書く必要があります。そのため、私はこのJava Tutorial on threadsを指摘しました。あなたは正しい、この問題は、特に初心者のためには、簡単ではありません。だから私は参考チュートリアルを読んで、上のコードのほとんどを理解できるはずです。簡単な方法はありませんが、少なくとも私にはわかりません。

+0

こんにちはJiriさん、上記のプログラムを説明してください。ちょっとだけ説明してください。より明確に理解できるようにしてください。また、スレッド3に通知するために、上記のように1つのスレッドに通知することもできます。 !! – user1320527

+0

こんにちはJiriさんは、私のような初心者のために非常に高いレベルであるので、この例を簡単な言葉で提供してください。 – user1320527

+0

同じことをシンプルな言葉で説明することができればすばらしいと思いますが、それは大きな助けとなるでしょう。 – user1320527

関連する問題