面试题--三个线程循环打印ABC10次的几种解决方法-Condition(3)
package com.ces.myThread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionExample {
private Lock lock = new ReentrantLock();
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition();
private String name = "A";
public class ThreadA implements Runnable {
@Override
public void run() {
for (int i = 0; i < 2; i++) {
lock.lock();
try {
while (!"A".equals(name)) {
try {
conditionA.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(name);
name = "B";
conditionB.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
public class ThreadB implements Runnable {
@Override
public void run() {
int count = 3;
for (int i = 0; i < 3; i++) {
lock.lock();
try {
while (!"B".equals(name)) {
try {
conditionB.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(name);
name = "C";
conditionC.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
public class ThreadC implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
lock.lock();
try {
while (!"C".equals(name)) {
try {
conditionC.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(name);
name = "A";
conditionA.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
public static void main(String[] args) {
ConditionExample conditionExample = new ConditionExample();
new Thread(conditionExample.new ThreadA()).start();
new Thread(conditionExample.new ThreadB()).start();
new Thread(conditionExample.new ThreadC()).start();
}
}