首页 > 代码库 > 一道线程的面试题

一道线程的面试题

线程1循环3次,线程2循环6次,线程3循环9次,接着又回到线程1循环3次,线程2循环6次,线程3循环9次...如此循环50次

  1 package ch03;
  2 
  3 import java.util.concurrent.locks.Condition;
  4 import java.util.concurrent.locks.Lock;
  5 import java.util.concurrent.locks.ReentrantLock;
  6 
  7 public class ConditionCommunication {
  8 
  9     public static void main(String[] args) {
 10         final Business business = new Business();
 11         //线程1
 12         new Thread(new Runnable() {
 13             
 14             @Override
 15             public void run() {
 16                 for(int i=1; i<=50; i++){
 17                     business.sub1(i);
 18                 }
 19             }
 20         }).start();
 21         
 22         //线程2
 23         new Thread(new Runnable() {
 24             
 25             @Override
 26             public void run() {
 27                 for(int i=1; i<=50; i++){
 28                     business.sub2(i);
 29                 }
 30             }
 31         }).start();
 32         
 33         //主线程
 34         for(int i=1; i<=50; i++){
 35             business.sub3(i);
 36         }
 37         
 38     }
 39 
 40 }
 41 
 42 /**
 43  * 将相似的业务代码封装在同一个类中
 44  *
 45  */
 46 class Business{
 47     
 48     private Lock lock = new ReentrantLock();
 49     //标志位,1:表示线程1执行;2表示线程2执行;3表示线程3执行
 50     volatile int flag = 1; 
 51     //条件
 52     private Condition condition1 = lock.newCondition();
 53     private Condition condition2 = lock.newCondition();
 54     private Condition condition3 = lock.newCondition();
 55     
 56     public void sub1(int i){
 57         lock.lock();
 58         
 59         while(flag != 1){
 60             try {
 61                 condition1.await(); //线程1等待
 62             } catch (InterruptedException e) {
 63                 e.printStackTrace();
 64             }
 65         }
 66         for(int j=1; j<=3; j++){
 67             System.out.println("sub1 "+j+",loop "+i);
 68         }
 69         flag = 2;
 70         //唤醒线程2
 71         condition2.signal();
 72         
 73         lock.unlock();
 74     }
 75     
 76     public void sub2(int i){
 77         lock.lock();
 78         
 79         while(flag != 2){
 80             try {
 81                 condition2.await();    //线程2等待
 82             } catch (InterruptedException e) {
 83                 e.printStackTrace();
 84             }
 85         }
 86         for(int j=1; j<=6; j++){
 87             System.out.println("sub2  执行"+j+"次,外部循环"+i);
 88         }
 89         flag = 3;
 90         //唤醒线程3
 91         condition3.signal();
 92         
 93         lock.unlock();
 94     }
 95     
 96     public void sub3(int i){
 97         lock.lock();
 98         
 99         while(flag != 3){
100             try {
101                 condition3.await();    //线程3等待
102             } catch (InterruptedException e) {
103                 e.printStackTrace();
104             }
105         }
106         for(int j=1; j<=9;j++){
107             System.out.println("sub3  执行"+j+"次,外部循环............"+i);
108         }
109         flag = 1;
110         //唤醒线程1
111         condition1.signal();
112         
113         lock.unlock();
114     }
115     
116 }