JavaSE进阶(四)——线程协作(通信)

JavaSE进阶(四)——线程协作(通信)

前言

之前介绍了线程方面的基本概念以及一些要点,这些要点可以在单个项目中完成线程操作等问题,但是我们无法让多个程序或系统之间出现线程的相互协作。接下来记录这一部分知识点。

生产者消费者模式

该模式不是GOF23中设计模式中的一种,它只是一种概念或这说是结构。这与我其他笔记中记录的微服务或者分布式的理论相同,我们在某些业务中需要生产者来提供前因,消费者接收了前因之后才能产出后果。这个理念其实就是单纯的顺序结构,我们在这一条线程的业务中就是需要按照顺序来逐步走完这段程序。

线程通信

Java中提供了几个方法解决下城之间的通信问题。这些方法都是在Object(老祖宗)中定义的。如下:

  • wait():表示线程一直在等待,直到其他线程通知,与sleep不同的是它会释放锁;
  • wait(long timeout):指定该线程等待的毫秒数;
  • notify():唤醒一个处于等待状态的线程;
  • notifyAll():唤醒同一个对象上所有调用wait()方法的线程,优先级别搞得线程优先调度。

解决方式

  • 管程法:

    解决线程通信的方法之一是管程法。管程法是将生产者生产的数据放入数据缓存区,消费者从缓存区拿出数据。

  • 信号灯法:

    设定一个标志位,通过布尔值来判定是否可以继续执行。

管程法

在此我不想贴代码,单纯的说一下逻辑:

  • 管程法中需要三个角色:

    • 生产者;
    • 消费者;
    • 产品。

    同时还有一个缓冲区;

  • 生产者只需要调用产品中的生产方法;

  • 消费者只需要调用产品中的消费方法;

  • 缓冲区中判定产品缓冲是否已满,如果满了就通知消费者消费;如果没满就通知生产者生产。

信号灯法

信号灯法主要是通过标志位的判定来解决线程通信。举个例子:春田花花幼儿园的小朋友们在午睡醒后会排队领取老师削皮的苹果,一人一个。今天老师睡过头了,醒来后没有时间削苹果,小朋友们已经排好队等着领取苹果,所以老师只能削好一个发一个。小朋友们排队依次等待老师发苹果,拿到苹果后才会走。

我在学习信号灯法的视频时发现弹幕上好多杠精,老师举了一个演员演节目,观众看节目的例子。好像触碰到了他们idol的禁区一样,各种抬杠,我都以为工地罢工了……

我这个例子不要杠,理解就好。非要杠的话我可以告诉你:第一篇笔记就说过我们只研究单个CPU的情况,多个老师削苹果是多个CPU同时工作;不要问我睡醒以后吃水果是否健康,免费的笔记看不惯没求着你看;不要说小朋友们等不耐烦了不要苹果怎么办,那是你自己手动关掉线程或者线程等待时间过长线程卡死系统报错。所以说不要杠我的笔记,爱看不看!

线程池

我们在使用线程的时候,如果要使用特别多的资源,可能会需要很多的线程,甚至有些时候线程被创建出来执行一次后就被销毁,这种情况在线程的创建和销毁的时候会浪费大量的资源。如果我们能够事先创建一些线程存储起来,需要用的时候拿出来,使用结束后放回去以供下次使用。

线程池就是这种作用,如果想了解更多就去看一看GOF23中设计模式中单例模式的特殊变种——有限多例模式。

总结

一个很懒的博主又糊弄完了一个知识点的笔记,哈哈哈,线程需要一定的基础,最后再建议一次:一定要看一下操作系统概述,这篇笔记中记录了线程方面的基础概念以及知识点,理论什么的也有涉及,所以大家可以回顾看一下这一片笔记。

下一阶段会讲解集合或者网络编程,大家等更新吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值