Binding lock multiple conditions

Calls between multiple threads in order to achieve A → B → C three thread starts, the following:

2 AA printing, BB printed three times, four times the CC printing, printing two successive order.

class ShareResource {
private 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 print2() {
lock.lock();
try {
while (number != 1) {
c1.await();
}
for(int i = 1; i <= 2; i++) {
System.out.println(Thread.currentThread().getName()+"\t" + i);
}
number = 2;
c2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void print3() {
lock.lock();
try {
while (number != 2) {
c2.await();
}
for(int i = 1; i <= 3; i++) {
System.out.println(Thread.currentThread().getName()+"\t" + i);
}
number = 3;
c3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void print4() {
lock.lock();
try {
while (number != 3) {
c3.await();
}
for(int i = 1; i <= 4; i++) {
System.out.println(Thread.currentThread().getName()+"\t" + i);
}
number = 1;
c1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}

public class SyncAndReentrantLockDemo {
public static void main(String[ ]args) {
ShareResource shareResource = new ShareResource();
new Thread(() ->{
for(int i = 1; i <= 2;i++ ) {
shareResource.print2();
}
},"AA").start();
new Thread(() ->{
for(int i = 1; i <= 2;i++ ) {
shareResource.print3();
}
},"BB").start();
new Thread(() ->{
for(int i = 1; i <= 2;i++ ) {
shareResource.print4();
}
},"CC").start();

}
}
运行结果见下图:

Guess you like

Origin www.cnblogs.com/liuyi13535496566/p/12153825.html