有三个字符串 S1="AAAAAAA..." , S2="BBBBBBBB..." , S3="CCCCCCC...",要求按照ABCABCABC...这样打印出来。
public class ThreadDemo {
private ReentrantLock lock = new ReentrantLock();
private Condition signalA = lock.newCondition();
private Condition signalB = lock.newCondition();
private Condition signalC = lock.newCondition();
private int flag = 1;
public void printA(String str) {
String[] split = str.split("");
for (int i = 0; i < split.length; i++) {
try {
lock.lock();
while (flag != 1) {
//表示没轮到当前线程执行,进入等待状态
signalA.await();
}
System.out.print(split[i]);
flag = 2;
//唤醒B 线程
signalB.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public void printB(String str) {
String[] split = str.split("");
for (int i = 0; i < split.length; i++) {
try {
lock.lock();
while (flag != 2) {
//表示没轮到当前线程执行,进入等待状态
signalB.await();
}
System.out.print(split[i]);
flag = 3;
//唤醒C 线程
signalC.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public void printC(String str) {
String[] split = str.split("");
for (int i = 0; i < split.length; i++) {
try {
lock.lock();
while (flag != 3) {
//当前线程等待状态
signalC.await();
}
System.out.print(split[i]);
flag = 1;
//唤醒A线程
signalA.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//释放锁
lock.unlock();
}
}
}
public static void main(String[] args) {
ThreadDemo n = new ThreadDemo();
new Thread(() -> {
n.printA("AAAAAAAAAAAA");
}).start();
new Thread(() -> {
n.printB("BBBBBBBBBBBB");
}).start();
new Thread(() -> {
n.printC("CCCCCCCCCCCC");
}).start();
}
}