多线程交替打印,循环输出ABBCCC
- 使用synchronized/wait/notifyAll
public class ABBCCC_Wait {
public static void main(String[] args) {
ABBCCCPrinter printer = new ABBCCCPrinter(1, 5);
new Thread(() -> {
printer.print("A", 1, 2);
}, "t1").start();
new Thread(() -> {
printer.print("B", 2, 3);
}, "t2").start();
new Thread(() -> {
printer.print("C", 3, 1);
}, "t3").start();
}
}
class ABBCCCPrinter{
private int flag;
private int loopNumber;
public ABBCCCPrinter(int flag, int loopNumber) {
this.flag = flag;
this.loopNumber = loopNumber;
}
public void print(String str, int waitFlag, int nextFlag){
for (int i = 0; i < loopNumber; i++) {
synchronized (this){
while (flag != waitFlag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 0; j < waitFlag; j++) {
System.out.print(str);
}
flag = nextFlag;
this.notifyAll();
}
}
}
}
- 使用lock/await/signalAll
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ABBCCC_Await {
public static void main(String[] args) {
final Lock lock = new ReentrantLock();
final Condition conditionA = lock.newCondition();
final Condition conditionB = lock.newCondition();
final Condition conditionC = lock.newCondition();
ABBCCC_Await_Printer printer = new ABBCCC_Await_Printer(1, 5);
new Thread(() -> {
printer.print("A", 1, 2, lock, conditionA, conditionB);
}, "t1").start();
new Thread(() -> {
printer.print("B", 2, 3, lock, conditionB, conditionC);
}, "t2").start();
new Thread(() -> {
printer.print("C", 3, 1, lock, conditionC, conditionA);
}, "t3").start();
}
}
class ABBCCC_Await_Printer {
private int flag;
private int loopNumber;
public ABBCCC_Await_Printer(int flag, int loopNumber) {
this.flag = flag;
this.loopNumber = loopNumber;
}
public void print(String str, int waitFlag, int nextFlag,
Lock lock,
Condition waitCondition,
Condition signalCondition) {
for (int i = 0; i < loopNumber; i++) {
lock.lock();
try {
while (flag != waitFlag){
try {
waitCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 0; j < waitFlag; j++) {
System.out.print(str);
}
flag = nextFlag;
signalCondition.signalAll();
}finally {
lock.unlock();
}
}
}
}