案例介绍
A 线程打印 5 次 A,B 线程打印 10 次 B,C 线程打印 15 次 C,按照 此顺序循环 10 轮
public class ThreadDemo2 {
private ReentrantLock reentrantLock = new ReentrantLock();
private Condition c1 = reentrantLock.newCondition();
private Condition c2 = reentrantLock.newCondition();
private Condition c3 = reentrantLock.newCondition();
private int flag = 1;
private void printA() {
reentrantLock.lock();
try {
while (flag != 1) {
c1.await();
}
for (int i = 0; i < 5; i++) {
System.out.print("A ");
}
System.out.println();
flag = 2;
c2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
reentrantLock.unlock();
}
}
private void printB() {
reentrantLock.lock();
try {
while (flag != 2) {
c2.await();
}
for (int i = 0; i < 10; i++) {
System.out.print("B ");
}
System.out.println();
flag = 3;
c3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
reentrantLock.unlock();
}
}
private void printC() {
reentrantLock.lock();
try {
while (flag != 3) {
c3.await();
}
for (int i = 0; i < 15; i++) {
System.out.print("C ");
}
System.out.println();
flag = 1;
c1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
reentrantLock.unlock();
}
}
public static void main(String[] args) {
ThreadDemo2 demo2 = new ThreadDemo2();
new Thread(() -> {
for (int i = 0; i < 3; i++) {
demo2.printA();
}
}).start();
new Thread(() -> {
for (int i = 0; i < 3; i++) {
demo2.printB();
}
}).start();
new Thread(() -> {
for (int i = 0; i < 3; i++) {
demo2.printC();
}
}).start();
}
}