我们可能有如下使用场景:
A、B、C三个线程,业务需要A执行5遍,然后B执行10遍,然后C执行15遍,如此循环
这时候我们可以考虑用到Lock的Condition机制
public class LockTest {
private volatile int number = 1;
private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void print5() throws InterruptedException {
lock.lock();
while(number != 1) {
c1.await();
}
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName());
}
number = 2;
c2.signal();
lock.unlock();
}
public void print10() throws InterruptedException {
lock.lock();
while(number != 2) {
c2.await();
}
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName());
}
number = 3;
c3.signal();
lock.unlock();
}
public void print15() throws InterruptedException {
lock.lock();
while(number != 3) {
c3.await();
}
for (int i = 0; i < 15; i++) {
System.out.println(Thread.currentThread().getName());
}
number = 1;
c1.signal();
lock.unlock();
}
public static void main(String[] args) {
LockTest lockTest = new LockTest();
new Thread(()->{
try {
for (int i = 0; i < 10; i++) {
lockTest.print5();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"AAA").start();
new Thread(()->{
try {
for (int i = 0; i < 10; i++) {
lockTest.print10();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"BBB").start();
new Thread(()->{
try {
for (int i = 0; i < 10; i++) {
lockTest.print15();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"CCC").start();
}
}