天天看點

線程condition

package com.ygl;
import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;public class Business {
  Lock lock=new ReentrantLock();
 Condition   condition  =lock.newCondition();
  private boolean isShouldSub=true;
  //主線程、子線程關聯的代碼歸為一類
   public   void  sub(int i){
   lock.lock();
    try{
     while(!isShouldSub){
      try{
       condition.await(); 
      }catch(Exception e){
       
      }
     }
      for(int j=0;j<10;j++){
      System.out.println("sub thread"+i+"========"+j); 
      }
      isShouldSub=false;
      condition.signal();
    }finally{
    lock.unlock();
    }
  
   }
   
   public   void  main(int i){
    lock.lock();
    try{
      while(isShouldSub){
       try{
        condition.await();
       }catch(Exception  e){
        
       }
      }
     for(int j=0;j<100;j++){
      System.out.println("main thread"+i+"========"+j); 
      }
     isShouldSub=true;
     condition.signal();
    }finally{
    lock.unlock();
    }
    }
   
 }//**********************************************
package com.ygl;
public class CommunicationRunnable implements Runnable{
  private Business business;
  public CommunicationRunnable() {
   
  }
  public CommunicationRunnable(Business business) {
   this.business=business;
  }
  @Override
  public void run() {
   for(int i=1;i<=50;i++){
    business.sub(i);
    
   }
   
   
  }
    
 }//*package com.ygl;
public class TraditionalThreadCommunication {
  
  public static void main(String[] args) {
   Business   business=new Business(); 
   CommunicationRunnable communicationRunnable=new CommunicationRunnable(business);
   Thread thread=new Thread(communicationRunnable);
   thread.start();
   for(int i=1;i<=50;i++){
    business.main(i);
    
   }
  }
 }
 ***************************************