package com.gofun.ms.common;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 生产和消费
* Lock与synchronized区别(本文未提到sync)
* ReentrantLock与Condition的使用Demo
*
* 题目:要求线程之间按顺序调用,A>B>C
* 需求:A线程打印5次,B线程打印10次,C线程打印15次
* A线程打印5次,B线程打印10次,C线程打印15次
* A线程打印5次,B线程打印10次,C线程打印15次
* ...
* 依次10轮
*
* 提醒:
* 判断锁/执行业务/唤醒下一个线程
* @author tonfay
*
*/
public class TestProdConsumer2 {
public static void main(String[] args) throws Exception {
Kongtiao1 kongtiao = new Kongtiao1();
for (int i = 1; i <= 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
kongtiao.print5();
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
kongtiao.print10();
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
kongtiao.print15();
}
}, "C").start();
}
}
}
class Kongtiao1 {
Integer number = 1;// 1:print5;2:pring10;3:pring15
Lock lock = new ReentrantLock();
Condition a = lock.newCondition();
Condition b = lock.newCondition();
Condition c = lock.newCondition();
public void print5() {
lock.lock();
try {
while (number != 1) {
a.await();
}
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + "\t print5 \t" + number);
}
number = 2;
b.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print10() {
lock.lock();
try {
while (number != 2) {
b.await();
}
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "\t print10 \t" + number);
}
number = 3;
c.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print15() {
lock.lock();
try {
while (number != 3) {
c.await();
}
for (int i = 1; i <= 15; i++) {
System.out.println(Thread.currentThread().getName() + "\t print15 \t" + number);
}
number = 1;
a.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}