/**
* 描述: 介绍Reentrantlock的condition条件可以实现精确唤醒某个线程
* 题目:多线程之间按顺序调用,实现A->B->C三个线程启动,要求AA打印5次BB打印10次CC打印15次,这样循环10轮
*
* @author [email protected]
* @create 2020/2/22 20:25
* @since 2.16.3
*/
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 prints5(){
lock.lock();
try{
// 1.判断
while(number != 1){
c1.await();
}
//2 干活
for(int i=1;i<=5;i++){
System.out.println(Thread.currentThread().getName()+"\t "+i);
}
//3修改标志位,通知下一个线程
number = 2;
c2.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void prints10(){
lock.lock();
try{
// 1.判断
while(number != 2){
c2.await();
}
//2 干活
for(int i=1;i<=10;i++){
System.out.println(Thread.currentThread().getName()+"\t "+i);
}
//3修改标志位,通知下一个线程
number = 3;
c3.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void prints15(){
lock.lock();
try{
// 1.判断
while(number != 3){
c3.await();
}
//2 干活
for(int i=1;i<=15;i++){
System.out.println(Thread.currentThread().getName()+"\t "+i);
}
//3修改标志位,通知下一个线程
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<=10;i++){
shareResource.prints5();
}
},"AA").start();
new Thread(()->{
for(int i=1;i<=10;i++){
shareResource.prints10();
}
},"BB").start();
new Thread(()->{
for(int i=1;i<=10;i++){
shareResource.prints15();
}
},"CC").start();
}
}
ReentrantLock的Condition条件实现精确唤醒某个线程
猜你喜欢
转载自blog.csdn.net/qq_36594703/article/details/104451176
今日推荐
周排行