java事件队列代码 java事件处理的过程( 八 )


3) 当调用wait()后,线程会释放掉它所占有的“锁标志” , 从而使线程所在对象中的其它synchronized数据可被别的线程使用 。
例17:
下面,我们将对例11中的例子进行修改
class TestThreadMethod extends Thread{
public static int shareVar = 0;
public TestThreadMethod(String name){
super(name);
}
public synchronized void run(){
if(shareVar==0){
for(int i=0; i10; i++){
shareVar++;
if(shareVar==5){
try{
this.wait(); //(4)
}
catch(InterruptedException e){}
}
}
}
if(shareVar!=0){
System.out.print(Thread.currentThread().getName());
System.out.println(" shareVar = " + shareVar);
this.notify(); //(5)
}
}
}
public class TestThread{
public static void main(String[] args){
TestThreadMethod t1 = new TestThreadMethod("t1");
TestThreadMethod t2 = new TestThreadMethod("t2");
t1.start(); //(1)
//t1.start();?。?)
t2.start(); //(3)
}}
运行结果为:
t2 shareVar = 5
因为t1和t2是两个不同对象 , 所以线程t2调用代码(5)不能唤起线程t1 。如果去掉代码(2)的注释 , 并注释掉代码(3) , 结果为:
t1 shareVar = 5
t1 shareVar = 10
这是因为,当代码(1)的线程执行到代码(4)时,它进入停滞状态,并释放对象的锁状态 。接着,代码(2)的线程执行run(),由于此时shareVar值为5,所以执行打印语句并调用代码(5)使代码(1)的线程进入可执行状态,然后代码(2)的线程结束 。当代码(1)的线程重新执行后,它接着执行for()循环一直到shareVar=10,然后打印shareVar 。

推荐阅读