线程轮循打印ABC...

  1 package com.java.concurrent;
  2 
  3 import java.util.concurrent.locks.Condition;
  4 import java.util.concurrent.locks.Lock;
  5 import java.util.concurrent.locks.ReentrantLock;
  6 
  7 /**
  8  * 使用多线程的方式进行轮循打印ABCABC
  9  * @author fliay
 10  *
 11  */
 12 public class TestABCAlternate {
 13 
 14     public static void main(String[] args) {
 15         final AlternateDemo ad = new AlternateDemo();
 16         new Thread(new Runnable() {
 17             
 18             public void run() {
 19                 for(int i = 1;i<10;i++){
 20                     try {
 21                         ad.loopA(i);
 22                     } catch (InterruptedException e) {
 23                         // TODO Auto-generated catch block
 24                         e.printStackTrace();
 25                     }
 26                 }
 27             }
 28         },"线程1").start();
 29         
 30     new Thread(new Runnable() {
 31             
 32             public void run() {
 33                 for(int i = 1;i<10;i++){
 34                     try {
 35                         ad.loopB(i);
 36                     } catch (InterruptedException e) {
 37                         // TODO Auto-generated catch block
 38                         e.printStackTrace();
 39                     }
 40                 }
 41             }
 42         },"线程2").start();
 43     
 44     
 45     new Thread(new Runnable() {
 46         
 47         public void run() {
 48             for(int i = 1;i<10;i++){
 49                 try {
 50                     ad.loopC(i);
 51                 } catch (InterruptedException e) {
 52                     // TODO Auto-generated catch block
 53                     e.printStackTrace();
 54                 }
 55             }
 56         }
 57     },"线程3").start();
 58     
 59     
 60     
 61     }
 62 
 63     
 64 
 65 }
 66 
 67 
 68 class AlternateDemo{
 69     
 70     private int number=1;//当前正在执行的线程标记
 71     
 72     private Lock lock = new ReentrantLock();
 73     
 74     private Condition condition1 = lock.newCondition();
 75     private Condition condition2 = lock.newCondition();
 76     private Condition condition3 = lock.newCondition();
 77     
 78     public void loopA(int totalLoop) throws InterruptedException{
 79         lock.lock();
 80         try{
 81             //1.判断
 82             if(number!=1){
 83                 condition1.await();
 84             }
 85             //2.打印
 86             System.out.println(Thread.currentThread().getName()+":A"+"-"+totalLoop);
 87             
 88             //3.唤醒
 89             number=2;
 90             condition2.signal();
 91         }finally{
 92             lock.unlock();
 93         }
 94     }
 95     
 96     public void loopB(int totalLoop) throws InterruptedException{
 97         lock.lock();
 98         try{
 99             //1.判断
100             if(number!=2){
101                 condition2.await();
102             }
103             //2.打印
104             System.out.println(Thread.currentThread().getName()+":B"+"-"+totalLoop);
105             
106             //3.唤醒
107             number=3;
108             condition3.signal();
109         }finally{
110             lock.unlock();
111         }
112     }
113     
114     
115     public void loopC(int totalLoop) throws InterruptedException{
116         lock.lock();
117         try{
118             //1.判断
119             if(number!=3){
120                 condition3.await();
121             }
122             //2.打印
123             System.out.println(Thread.currentThread().getName()+":C"+"-"+totalLoop);
124             
125             //3.唤醒
126             number=1;
127             condition1.signal();
128         }finally{
129             lock.unlock();
130         }
131     }
132     
133     
134     
135     
136     
137     
138     
139     
140     
141     
142     
143     
144 }

 

posted @ 2017-10-17 11:27  fliay  阅读(206)  评论(0编辑  收藏  举报