1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| public class PrintA5B10C15 { private final Lock lock = new ReentrantLock(); private final Condition conditionA = lock.newCondition(); private final Condition conditionB = lock.newCondition(); private final Condition conditionC = lock.newCondition(); private int state = 0;
public static void main(String[] args) { PrintA5B10C15 task = new PrintA5B10C15(); new Thread(() -> task.print("A", 0, 5)).start(); new Thread(() -> task.print("B", 1, 10)).start(); new Thread(() -> task.print("C", 2, 15)).start(); }
public void print(String letter, int target, int times) { for(int i = 0; i < 10; i ++ ) { try { lock.lock(); while(state != target) { if(target == 0) { conditionA.await(); }else if(target == 1) { conditionB.await(); }else { conditionC.await(); } } for(int j = 0; j < times; j ++ ) { System.out.print(letter); } if(state == 2) { System.out.println(); } state = (state + 1) % 3; if(target == 0) { conditionB.signal(); }else if(target == 1) { conditionC.signal(); }else { conditionA.signal(); } } catch (Exception e) { throw new RuntimeException(e); } finally { lock.unlock(); } } } }
|