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 }