等待/通知。为什么所有线程都会收到通知?

时间:2013-08-09 11:02:52

标签: java multithreading

以下是代码段

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. 为什么睡觉正在打印`Thread [Thread-0,5,main]
  3. 在整个计划的工作中很丢失。
  4. 任何指针都会有所帮助。

    感谢。

2 个答案:

答案 0 :(得分:3)

您正在Thread的实例上进行同步。如果您选中the documentation,则会在Thread方法完成时看到run实例通知。这就是join机制的实现方式。

执行一个显式notify调用(我们在代码中看到的调用),并在执行完线程时执行另一个隐式notifyAll调用。您甚至可以删除明确的notify,并且由于最后的隐式notifyAll,行为不会发生变化。

答案 1 :(得分:1)

  1. 已经回答,但你不应该在Thread对象上同步。
  2. Thread的toString()方法返回其ThreadGroup中所有线程的名称,而不仅仅是当前线程的名称。