package test;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/* 多个线程之间按顺序调用。实现A -> B -> C 三个线程打印
* A打印5次,B打印10次,C打印15次
* 紧接着
* A打印5次,B打印10次,C打印15次
* ...
* 来10次
*
*
* */
class ShareResource {
private int num = 1;
// 保证线程安全
private Lock lock = new ReentrantLock();
// 线程通信
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void print5() {
lock.lock();
try {
// 判断
while (num !=1 ) { // 说明A等待
c1.await();
}
// A干活
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i);
}
//通知B
num = 2;
c2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print10() {
lock.lock();
try {
// 判断
while (num !=2 ) { // 说明B等待
c2.await();
}
// B干活
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i);
}
//通知C
num = 3;
c3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print15() {
lock.lock();
try {
// 判断
while (num !=3 ) { // 说明C等待
c3.await();
}
// B干活
for (int i = 0; i < 15; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i);
}
//通知A
num = 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 = 0; i < 10; i++) {
shareResource.print5();
}
},"A").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
shareResource.print10();
}
},"B").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
shareResource.print15();
}
},"C").start();
}
}