黑马程序员——Java基础---线程的另一个总结(7)--condition,await

来源:互联网 发布:大数据精准营销特点 编辑:程序博客网 时间:2024/05/17 01:27

与前边的通讯互斥的synchronized与wait相同

这里使用condition与await相同

public class ConditionCommunication {/** * @param args */public static void main(String[] args) {final Business business = new Business();new Thread(new Runnable() {@Overridepublic void run() {for(int i=1;i<=50;i++){business.sub(i);}}}).start();for(int i=1;i<=50;i++){business.main(i);}}static class Business {Lock lock = new ReentrantLock();Condition condition = lock.newCondition();  private boolean bShouldSub = true;  public  void sub(int i){  lock.lock();  try{  while(!bShouldSub){  try {condition.await();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}  }for(int j=1;j<=10;j++){System.out.println("sub thread sequence of " + j + ",loop of " + i);}  bShouldSub = false;  condition.signal();  }finally{  lock.unlock();  }  }    public  void main(int i){  lock.lock();  try{ while(bShouldSub){  try {condition.await();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}  }for(int j=1;j<=100;j++){System.out.println("main thread sequence of " + j + ",loop of " + i);}bShouldSub = true;condition.signal();  }finally{  lock.unlock();  }  }}}

实现三线程互斥

public class ThreeConditionCommunication {/** * @param args */public static void main(String[] args) {final Business business = new Business();new Thread(new Runnable() {@Overridepublic void run() {for(int i=1;i<=50;i++){business.sub2(i);}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for(int i=1;i<=50;i++){business.sub3(i);}}}).start();for(int i=1;i<=50;i++){business.main(i);}}static class Business {Lock lock = new ReentrantLock();Condition condition1 = lock.newCondition();Condition condition2 = lock.newCondition();Condition condition3 = lock.newCondition();  private int shouldSub = 1;  public  void sub2(int i){  lock.lock();  try{  while(shouldSub != 2){  try {condition2.await();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}  }for(int j=1;j<=10;j++){System.out.println("sub2 thread sequence of " + j + ",loop of " + i);}  shouldSub = 3;  condition3.signal();  }finally{  lock.unlock();  }  }  public  void sub3(int i){  lock.lock();  try{  while(shouldSub != 3){  try {condition3.await();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}  }for(int j=1;j<=20;j++){System.out.println("sub3 thread sequence of " + j + ",loop of " + i);}  shouldSub = 1;  condition1.signal();  }finally{  lock.unlock();  }  }      public  void main(int i){  lock.lock();  try{ while(shouldSub != 1){  try {condition1.await();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}  }for(int j=1;j<=100;j++){System.out.println("main thread sequence of " + j + ",loop of " + i);}shouldSub = 2;condition2.signal();  }finally{  lock.unlock();  }  }}}


0 0
原创粉丝点击