4

ここにコードスニペットがあります

public class ITC3 extends Thread {
  private ITC4 it;

  public ITC3(ITC4 it){
    this.it = it;
  }
  public static void main(String[] args) {
    ITC4 itr = new ITC4();
    System.out.println("name is:" + itr.getName());
    ITC3 i = new ITC3(itr);
    ITC3 ii = new ITC3(itr);


    i.start(); ii.start();
    //iii.start();
    try{
      Thread.sleep(1000);
    }catch(InterruptedException ie){}
    itr.start();
  }

  public void run(){
    synchronized (it){
      try{

        System.out.println("Waiting - " + Thread.currentThread().getName());
        it.wait();
        System.out.println("Notified " + Thread.currentThread().getName());
      }catch (InterruptedException ie){}
    }
  }
}

class ITC4 extends Thread{
  public void run(){
    try{
      System.out.println("Sleeping : " + this);
      Thread.sleep(3000);
      synchronized (this){
        this.notify();
      }
    }catch(InterruptedException ie){}
  }
}

与えられた出力は

Output: 
Waiting - Thread-1 
Waiting - Thread-2 
Sleeping : Thread[Thread-0,5,main] 
Notified Thread-1 
Notified Thread-2 

これで、すべてのスレッドが通知を受けます。この場合、出力全体を理解できません。

  1. すべてのスレッドが通知されるのはなぜですか?
  2. Sleeping が `Thread[Thread-0,5,main] を出力する理由
  3. プログラム全体の作業でかなり迷子になりました。

どんなポインタも役に立ちます。

ありがとう。

4

2 に答える 2

3

のインスタンスで同期していますThreadドキュメントを確認すると、メソッドが完了Threadするとインスタンスに通知されることがわかります。runこれがjoinメカニズムの実装方法です。

1 つの明示的な呼び出し (コードに表示されているもの) を実行し、スレッドが完了したときにnotify別の暗黙的な呼び出しを実行します。notifyAll明示的なものを削除することもできますが、最後notifyに暗黙的なものがあるため、動作は変わりませんnotifyAll

于 2013-08-09T11:13:41.320 に答える
1
  1. 既に回答されていますが、Thread オブジェクトで同期するべきではありません。
  2. Thread の toString() メソッドは、現在のスレッドの名前だけでなく、ThreadGroup 内のすべてのスレッドの名前を返します。
于 2013-08-09T11:24:56.697 に答える