多线程 交替打印,控制线程执行顺序 ReentrantLock
2021-02-26 本文已影响0人
川流不息attitude
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author lyc
* @date 2021/2/20
*/
public class TestThread {
private static int j =0;
static Locklock =new ReentrantLock();
static ConditionconditionA =lock.newCondition();
static ConditionconditionB =lock.newCondition();
static ConditionconditionC =lock.newCondition();
public void printA()throws InterruptedException {
lock.lock();
while (j!=0){
conditionA.await();
}
System.out.print(Thread.currentThread().getName()+"A");
j++;
conditionB.signal();
lock.unlock();
}
public void printB()throws InterruptedException {
lock.lock();
while (j!=1){
conditionB.await();
}
System.out.print(Thread.currentThread().getName()+"B");
j++;
conditionC.signal();
lock.unlock();
}
public void printC()throws InterruptedException {
lock.lock();
while (j!=2){
conditionC.await();
}
System.out.println(Thread.currentThread().getName()+"C");
j =0;
conditionA.signal();
lock.unlock();
}
public static void main(String[] args)throws InterruptedException {
TestThread testThread =new TestThread();
new Thread(()->{
try {
for (int i =0; i <5; i++) {
testThread.printA();
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{
try {
for (int i =0; i <5; i++) {
testThread.printB();
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{
try {
for (int i =0; i <5; i++) {
testThread.printC();
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}