import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author juntech
* @version ${version}
* @date 2019/12/19 16:03
* @ClassName 类名
* @Descripe 描述
*/
public class TestABCAlternateDemo {
public static void main(String[] args) {
ABCAlterNate ad = new ABCAlterNate();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i < 20; i++) {
ad.loopA(i);
}
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i < 20; i++) {
ad.loopB(i);
}
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i < 20; i++) {
ad.loopC(i);
System.out.println("----------------------------");
}
}
}, "C").start();
}
}
class ABCAlterNate {
private int num = 1; //正在执行的标志
private Lock lock = new ReentrantLock();
//开启3个condition通信
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition();
/**
* @param totalLoop 循环次数
*/
public void loopB(int totalLoop) {
//加锁
lock.lock();
try {
//1.判断
if (num != 2) {
conditionB.await();
}
//2.循环打印
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
}
//3.唤醒
num = 3;
conditionC.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void loopC(int totalLoop) {
//加锁
lock.lock();
try {
//1.判断
if (num != 3) {
conditionC.await();
}
//2.循环打印
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
}
//3.唤醒
num = 1;
conditionA.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void loopA(int totalLoop) {
//加锁
lock.lock();
try {
//1.判断
if (num != 1) {
conditionA.await();
}
//2.循环打印
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
}
//3.唤醒
num = 2;
conditionB.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
点击运行:
A 0 1
A 1 1
A 2 1
A 3 1
A 4 1
B 0 1
B 1 1
B 2 1
B 3 1
B 4 1
C 0 1
C 1 1
C 2 1
C 3 1
C 4 1
C 5 1
C 6 1
C 7 1
C 8 1
C 9 1
C 10 1
C 11 1
C 12 1
C 13 1
C 14 1
C 15 1
C 16 1
C 17 1
C 18 1
C 19 1
----------------------------
A 0 2
A 1 2
A 2 2
A 3 2
A 4 2
B 0 2
B 1 2
B 2 2
B 3 2
B 4 2
C 0 2
C 1 2
C 2 2
C 3 2
C 4 2
C 5 2
C 6 2
C 7 2
C 8 2
C 9 2
C 10 2
C 11 2
C 12 2
C 13 2
C 14 2
C 15 2
C 16 2
C 17 2
C 18 2
C 19 2
----------------------------
A 0 3
A 1 3
A 2 3
A 3 3
A 4 3
B 0 3
B 1 3
B 2 3
B 3 3
B 4 3
C 0 3
C 1 3
C 2 3
C 3 3
C 4 3
C 5 3
C 6 3
C 7 3
C 8 3
C 9 3
C 10 3
C 11 3
C 12 3
C 13 3
C 14 3
C 15 3
C 16 3
C 17 3
C 18 3
C 19 3
----------------------------
A 0 4
A 1 4
A 2 4
A 3 4
A 4 4
B 0 4
B 1 4
B 2 4
B 3 4
B 4 4
C 0 4
C 1 4
C 2 4
C 3 4
C 4 4
C 5 4
C 6 4
C 7 4
C 8 4
C 9 4
C 10 4
C 11 4
C 12 4
C 13 4
C 14 4
C 15 4
C 16 4
C 17 4
C 18 4
C 19 4
----------------------------
A 0 5
A 1 5
A 2 5
A 3 5
A 4 5
B 0 5
B 1 5
B 2 5
B 3 5
B 4 5
C 0 5
C 1 5
C 2 5
C 3 5
C 4 5
C 5 5
C 6 5
C 7 5
C 8 5
C 9 5
C 10 5
C 11 5
C 12 5
C 13 5
C 14 5
C 15 5
C 16 5
C 17 5
C 18 5
C 19 5
----------------------------
A 0 6
A 1 6
A 2 6
A 3 6
A 4 6
B 0 6
B 1 6
B 2 6
B 3 6
B 4 6
C 0 6
C 1 6
C 2 6
C 3 6
C 4 6
C 5 6
C 6 6
C 7 6
C 8 6
C 9 6
C 10 6
C 11 6
C 12 6
C 13 6
C 14 6
C 15 6
C 16 6
C 17 6
C 18 6
C 19 6
----------------------------
.......