多线程问题 多线程问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 13:06:35
import java.net.*;
import java.io.*;

public class rt{

public static void main(String args[]){
Object o=new Object();

new WFReceive(o,1).start();
new WFReceive(o,2).start();
synchronized(o){
o.notifyAll();}
new w(o,3).start();

}
}

class WFReceive extends Thread{
Object o=new Object();
int i=0;
WFReceive(Object o,int i){this.o=o;this.i=i;}
public void run()
{
synchronized(o)
{
System.out.println(i);

try{o.wait();
}catch(InterruptedException e){ }

System.out.println(i*10);
try{o.wait();
}catch(InterruptedException e){ }
System.out.println(i*100);
}
}
}

class w extends Thread{
Object o=new Object();
int i=0;
w(Object o,int i){this.o=o;this.i=i;}
public

对象的wait()方法一旦调用,则会释放该对象的锁。而对象的notify()方法如果要调用,则必须先获得这个对象的锁。简单来说也就是一定要该对象wait()了才能够对它进行notify()操作
这个程序最后的o.notifyAll(),相当于是把所有o.wait()的线程逐个
o.notify()。那么一旦某个线程在o.notify()的时候,没有获得到o的锁,那么这个线程就不会响应notify()。现在只输出了10,说明只是第一个线程获得了o的锁,得以执行notify(),但是还没有来得及执行到下面o.wait(),第二个线程的o.notify()就开始执行了,这样第二个线程就获取不到o的锁,也就不会响应o.notify(),输出20。
这个程序的o.notifyAll()是紧接着线程start(),机器比较快的情况下,很可能连第一个线程都没执行到o.wait()就开始o.notify(),这样连10也输不出来。