2012-04-28 48 views
0

我明白wait()notify()/notifyAll()方法用于替换在其他语言中使用的传统的循环/轮询结构的目的:如何等待/通知和条件管理线程

while(true) { 
    if(pollSomethingForAnEvent()) 
     break; 
} 

我进一步明白Condition API是在Java 5中引入以在更“OO”的实现中包装这个模型。

不明白就是Java怎么知道哪个线程通知时Object.notify()Condition.signal()叫,不然怎么知道的Java与Object.wait()Condition.await()到信号,线程被称为?

由于这些方法不需要任何参数,因此JVM如何知道哪些线程将这些通知传递给?!?!

+1

一般来说,如果只有一个线程被唤醒,它会先到先服务。也就是说,第一个执行wait命令的线程是第一个被通知的。 – jpm 2012-04-28 15:53:31

回答

2

对于每个Condition或同步的对象,JVM维护一个等待对象的队列。它还具有运行队列和其他数据结构,用于维护和管理Thread运行状态。

当调用Object.notify()时,它只查找与该对象关联的队列,将第一个Thread移到那里并将其移动到运行队列中。如果队列为空,则不通知线程。如果notifyAll()被调用,则在该对象上等待的所有线程都被发送信号。

不是使问题复杂化,但有一点是必须认识到的是,当一个Thread调用lockObject.wait()通知,它从一个等待状态移动到运行队列的年底等待获得访问锁在lockObject。它不会立即开始运行。