给定一个线程有多个状态:alive runnable运行等待并终止。notifyAll()方法假设将所有等待对象锁定的线程置回到“可运行”状态,在该状态下它可以被选为下一个运行对象。 以下示例实例化并启动3个读取器线程,它们将等待(wait()方法),直到释放'calc'对象的锁定。 calc对象线程被实例化并在此之后开始,在它之后加上一些数字,接着是notifyAll()。线程notifyAll()
我的问题是,为什么计算线程不会每次都通知所有的读线程?当我在电脑上运行它时,它会被击中并错过。
public class Reader extends Thread{
Calculator c;
public Reader(Calculator calc){
c=calc;
}
public void run(){
synchronized(c){
try{
System.out.println("Waiting for calculation...");
c.wait();
}catch(InterruptedException e){}
System.out.println("Total is: "+c.total);
}
}
public static void main(String[] args){
Calculator calc = new Calculator();
new Reader(calc).start();
new Reader(calc).start();
new Reader(calc).start();
new Thread(calc).start();
}
}
class Calculator implements Runnable{
int total;
public void run(){
synchronized(this){
for(int i =0; i<100; i++){
total+=i;
}
notifyAll();
}
}
}
'notifyAll()'不_立即使线程RUNNABLE。它有效地将其状态从WAITING更改为BLOCKED。线程A中的'o.wait()'调用只有在线程A获得对象'o'上的锁定后才能返回,但当线程B调用'o.notifyAll()'时线程无法执行,因为线程B必须持有锁才能拨打该电话。 –