逻辑:当线程1 执行完之后 通知线程2 再通知3 循序
用了ReentrantLock锁来完成,创建多个Condition
package com.daijunyi.lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class PrintTest {
private int flag = 0; //0表示 c1 1表示 c2 2表示c3
private ReentrantLock reentrantLock = new ReentrantLock();
private Condition c1 = reentrantLock.newCondition();
private Condition c2 = reentrantLock.newCondition();
private Condition c3 = reentrantLock.newCondition();
private void print1() throws InterruptedException {
reentrantLock.lock();
try {
while (flag != 0){
c1.await();
}
System.out.println(Thread.currentThread().getName()+"print1打印");
flag = 1;
c2.signal();
}finally {
reentrantLock.unlock();
}
}
private void print2() throws InterruptedException {
reentrantLock.lock();
try {
while (flag != 1){
c2.await();
}
System.out.println(Thread.currentThread().getName()+"print2打印");
flag = 2;
c3.signal();
}finally {
reentrantLock.unlock();
}
}
private void print3() throws InterruptedException {
reentrantLock.lock();
try {
while (flag != 2){
c3.await();
}
System.out.println(Thread.currentThread().getName()+"print3打印");
flag = 0;
c1.signal();
}finally {
reentrantLock.unlock();
}
}
public static void main(String[] args) {
PrintTest printTest = new PrintTest();
new Thread(()->{
for (int i=0;i<10;i++){
try {
printTest.print1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"线程1").start();
new Thread(()->{
for (int i=0;i<10;i++) {
try {
printTest.print2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"线程2").start();
new Thread(()->{
for (int i=0;i<10;i++) {
try {
printTest.print3();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"线程3").start();
}
}