【面试:并发篇18:多线程:设计模式】保护性暂停的应用与扩展

本文详细解析了Java中`join()`方法的实现原理,展示了其作为保护性暂停设计模式的运用。同时,通过一个寄信人与邮递员的比喻,介绍了如何通过解耦等待与生产来降低消息传递的复杂度,使用`Mailboxes`类作为中介,实现线程间的高效通信。文中给出了具体的代码示例和运行结果分析。
摘要由CSDN通过智能技术生成

【面试:并发篇18:多线程:设计模式】保护性暂停的应用与扩展

00.前言

如果有任何问题请指出,感谢。

01.join实现原理

join源码

我们来分析一下它的源码

我们可以看出如果join给定的时间小于0就抛出异常

如果给定的时间为0,其实也就是不加参数的join,他就会判断是否isAlive也就是判断调用join的线程是否存活,如果存活则wait(0)即一直等待,注意这里的wait是让t1.join同步的线程等待 t1线程运行。举一个例子就是在main线程运行t1.join(),那么isAlive判断的是t1线程是否存在,wait(0)是让main线程进行等待

如果给定的时间大于0,那么这里的代码就和我们的上一篇内容里的保护性暂停扩展-增加超时 一模一样了,这里就是 保护性暂停 这个设计模式的体现

join方法整体就是 保护性暂停 设计模式 的体现,只不过它没有传递数据 只是用来让其他线程陷入等待 使其调用join的线程可以先执行

02.扩展-解耦等待与成产

介绍

这个图中 t0 t2 t4是寄信人线程,t1 t3 t5负责邮递员线程 负责送信与代写信。每个信都有自己的id与内容 id可以理解为收信人的地址,寄信人通过邮递员把新送给收信人,这里我们只研究寄信人与邮递员之间的消息传递。注意:一个邮递员只能寄一封信。
为什么要这样设计
这样设计的好处是解耦 也就是降低消息传递的复杂度与关联度,我们把Futures当做邮局 寄信人 把信给邮局 然后邮递员来取信送出,我们可以想象一下 如果没有这个邮局 我们会怎么样?我们需要亲自跑到邮递员家里 把信给他 这期间邮递员可能有事出门了 你就白去了 总之这样做 效率很低,这就是邮局的好处。

代码

@Slf4j(topic = "c.Test20")
public class Test20 {
   
    public static void main(String[] args) throws InterruptedException {
   
        for (int i = 0; i < 3; i++) {
   
            new People().start();
        }
        Sleeper.sleep(1);
        for (Integer id : Mailboxes.getIds()) {
   
            new Postman(id, "内容" + id).start();
        }
    }
}

@Slf4j(topic = "c.People"
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

I cream

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

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

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

打赏作者

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

抵扣说明:

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

余额充值