节录于<<张孝祥-Java多线程与并发库高级应用>>
class Business{
public void main(int j){ //j作为最大的那个50次循环
for(int i=1;i<=10;i++)
System.out.println("main "+i+" of loop "+j);
}
public void sub(int j){ //j作为最大的那个50次循环
for(int i=1;i<=5;i++)
System.out.println("sub "+i+" of loop "+j);
}
}然后就简单了,我们做出调用的类public class TraditionalCommunication{
public static void main(String[] args){
final Business b=new Business();
new Thread(
new Runnable(){
public void run(){
for(int i=1;i<=50;i++)
b.sub(i);
}
}
).start();
for(int i=1;i<=50;i++)
b.main(i);
}
}可能父线程刚走了一圈(输出了一行代码),子线程就抢过了执行权。
这个时候再测试,最起码两个线程(父线程子线程)不会互相干扰(互斥),但是还有可能父线程接连着运行了两圈(输出了20行代码)也就是说,我们让两个线程能互斥,但是不能协调的通信。(他们没有交替输出!)
class Business{
private boolean shouldsub=true; //这个变量名 起的很不错
public synchronized void main(int j){ //j作为最大的那个50次循环
if(shouldsub){
try{
this.wait();
}catch(Exception e){ }
}
for(int i=1;i<=10;i++)
System.out.println("main "+i+" of loop "+j);
shouldsub=true; //父线程已经执行了一次 所以shouldsub为true 该子线程执行了
this.notify();
}
public synchronized void sub(int j){ //j作为最大的那个50次循环
if(!shouldsub){
try{
this.wait();
}catch(Exception e){ }
}
for(int i=1;i<=5;i++)
System.out.println("sub "+i+" of loop "+j);
shouldsub=false; //子线程已经执行了一次 所以shouldsub为false 不能再执行了
this.notify();
}
} if(!shouldsub){
try{
this.wait();
}catch(Exception e){ }
}
应该改成下面的形式
while(!shouldsub){
try{
this.wait();
}catch(Exception e){}
}原文:http://blog.csdn.net/dlf123321/article/details/42751405