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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| public class PrintTest { static volatile int count = 1; public static void printZero() { System.out.print("0"); } public static void printOdd() { System.out.print(count); } public static void printEven() { System.out.print(count); }
public static void print(int n) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); Condition zeroCond = lock.newCondition(); Condition oddCond = lock.newCondition(); Condition evenCond = lock.newCondition();
Thread zero = new Thread(() -> { lock.lock(); while (count <= n) { zeroCond.await(); if (count <= n) { printZero(); } if (count % 2 == 1) { evenCond.signal(); } else { oddCond.signal(); } } lock.unlock(); }); Thread odd = new Thread(() -> { lock.lock(); while (count <= n) { oddCond.await(); if (count > n) { return; } printEven(); count++; zeroCond.signal(); } lock.unlock(); });
Thread even = new Thread(() -> { lock.lock(); while (count <= n) { evenCond.await(); if (count > n) { return; } printOdd(); count++; zeroCond.signal(); } lock.unlock(); });
zero.start(); odd.start(); even.start();
lock.lock(); zeroCond.signal(); lock.unlock();
zero.join(); odd.join(); even.join(); } }
|