ReentrantLock实现交替打印abc。(await&signal)

package ao.com;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

//await和signal。ReentrantLock实现交替打印。
public class Test03 {
    public static void main(String[] args) throws InterruptedException {
        AwaitSingnal awaitSingnal = new AwaitSingnal(5);
        //各自的条件区域
        Condition a = awaitSingnal.newCondition();
        Condition b = awaitSingnal.newCondition();
        Condition c = awaitSingnal.newCondition();
        Thread t1 = new Thread(()->{
            awaitSingnal.print("a",a,b);
        },"t1");
        Thread t2 = new Thread(()->{
            awaitSingnal.print("b",b,c);
        },"t2");
        Thread t3 = new Thread(()->{
            awaitSingnal.print("c",c,a);
        },"t3");
        t1.start();
        t2.start();
        t3.start();
        Thread.sleep(1000);
        //主线程初始化,唤醒a阻塞区域,打印第一个a
        awaitSingnal.lock();
        try {
            a.signal();
        } finally {
            awaitSingnal.unlock();
        }

    }
}
class AwaitSingnal extends ReentrantLock{
    //循环次数
    private int loopNumber;

    public AwaitSingnal(int loopNumber){
        this.loopNumber = loopNumber;
    }
    //打印的时候需要的参数有:打印内存、当前阻塞区域(a区域,b区域,c区域)、下一个要打印唤醒的区域。
    public void print(String s, Condition current,Condition next){
        int i = 0 ;
        while (i++ < loopNumber){
        lock();
        try {
            //先让需要打印的内容全部放在各自的阻塞区域中
            current.await();
            //初始化唤醒的时候就打印了
            System.out.print(s);
            //唤醒下一个
            next.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            unlock();
        }
    }
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失忆机器

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值