三个线程交替输出20遍A、B、C
public class PrintABC{
Lock lock = new ReentrantLock();
int index = 1; //1 打A 2 打B 3 打C
Condition conditionA = lock.newCondition();
Condition conditionB = lock.newCondition();
Condition conditionC = lock.newCondition();
public void printA() throws InterruptedException {
lock.lock();
try {
if (index != 1) {
conditionA.await();
}
System.out.println("A");
index = 2;
conditionB.signal();
} finally {
lock.unlock();
}
}
public void printB() throws InterruptedException {
lock.lock();
try {
if (index != 2) {
conditionB.await();
}
System.out.println("B");
index = 3;
conditionC.signal();
} finally {
lock.unlock();
}
}
public void printC() throws InterruptedException {
lock.lock();
try {
if (index != 3) {
conditionC.await();
}
System.out.println("C");
index = 1;
conditionA.signal();
} finally {
lock.unlock();
}
}
}
测试类
public class test {
public static void main(String[] args) {
PrintABC printABC = new PrintABC();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
try {
printABC.printA();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
try {
printABC.printB();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
try {
printABC.printC();
System.out.println("---------------第" + (i + 1) + "次---------------");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}