4

我需要在这里解释一下。

 public static void main(String[] args) {
    FirstThread obj = new FirstThread();
    for (int i = 1; i <= 10; i++) {
      new WaiterThread(obj).start();
    }
    obj.start();
  }

public class FirstThread extends Thread {
  @Override
  public void run() {
    // Do something
  }
}


public class WaiterThread extends Thread {
  Object obj;

  WaiterThread(Object obj) {
    this.obj = obj;
  }

  @Override
  public void run() {
    synchronized (obj) {
           obj.wait();
    }
  }
}

为WaiterThread创建了 10 个线程,并且正在等待单个FirstThread对象。在FirstThread终止后,所有WaiterThread都恢复了,而没有在任何地方调用obj.notify()obj.notifyAll()

这是否意味着 WaiterThread停止等待FirstThread因为它被终止了?

4

3 回答 3

6

这是当线程终止时,它会调用 this.notifyAll() (如 的 javadoc 中所述)这一事实的副作用Thread.join()。相同的 javadoc 还提出以下建议:

建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll

于 2013-08-22T08:45:12.207 回答
6

根据的文档Thread,一个垂死的线程调用notifyAll代表它的实例。

此外,引用相同的文档:

建议应用程序不要在实例上使用waitnotify或。notifyAllThread

当然,同样的建议也适用于Thread subclasses的实例,这就是您的代码正在做的事情。

于 2013-08-22T08:44:08.163 回答
0

我修改了一个代码如下

main() 方法保持不变

 public static void main(String[] args) {
    FirstThread obj = new FirstThread();
    for (int i = 1; i <= 10; i++) {
      new WaiterThread(obj).start();
    }
    obj.start();
  }

变化如下

class WaiterThread extends Thread {
    Object obj;

    WaiterThread(Object obj) {
        this.obj = obj;
    }

    @Override
    public void run() {
        synchronized (obj) {
            try {
                obj.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread " + this.getId() + "started");
        }
        System.out.println("Out of sync block by " + this.getId());
    }
}

我得到的输出是

FirstThread Started
Thread 19started
Out of sync block by 19
Thread 18started
Out of sync block by 18
Thread 17started
Out of sync block by 17
Thread 16started
Out of sync block by 16
Thread 15started
Out of sync block by 15
Thread 14started
Out of sync block by 14
Thread 13started
Out of sync block by 13
Thread 12started
Out of sync block by 12
Thread 11started
Out of sync block by 11
Thread 10started
Out of sync block by 10

所以你有你的答案。它们不是同时启动的!FirstThread 在终止时调用 notifyAll() 通知所有线程,但每个线程一次只能拥有一个锁。因此,尽管每个线程都收到通知,但一次只执行一个线程。

于 2013-08-22T08:46:46.937 回答