节录于<<张孝祥-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