JavaSE进阶(四)——线程协作(通信)
前言
之前介绍了线程方面的基本概念以及一些要点,这些要点可以在单个项目中完成线程操作等问题,但是我们无法让多个程序或系统之间出现线程的相互协作。接下来记录这一部分知识点。
生产者消费者模式
该模式不是GOF23中设计模式中的一种,它只是一种概念或这说是结构。这与我其他笔记中记录的微服务或者分布式的理论相同,我们在某些业务中需要生产者来提供前因,消费者接收了前因之后才能产出后果。这个理念其实就是单纯的顺序结构,我们在这一条线程的业务中就是需要按照顺序来逐步走完这段程序。
线程通信
Java中提供了几个方法解决下城之间的通信问题。这些方法都是在Object(老祖宗)中定义的。如下:
- wait():表示线程一直在等待,直到其他线程通知,与sleep不同的是它会释放锁;
- wait(long timeout):指定该线程等待的毫秒数;
- notify():唤醒一个处于等待状态的线程;
- notifyAll():唤醒同一个对象上所有调用wait()方法的线程,优先级别搞得线程优先调度。
解决方式
-
管程法:
解决线程通信的方法之一是管程法。管程法是将生产者生产的数据放入数据缓存区,消费者从缓存区拿出数据。
-
信号灯法:
设定一个标志位,通过布尔值来判定是否可以继续执行。
管程法
在此我不想贴代码,单纯的说一下逻辑:
-
管程法中需要三个角色:
- 生产者;
- 消费者;
- 产品。
同时还有一个缓冲区;
-
生产者只需要调用产品中的生产方法;
-
消费者只需要调用产品中的消费方法;
-
缓冲区中判定产品缓冲是否已满,如果满了就通知消费者消费;如果没满就通知生产者生产。
信号灯法
信号灯法主要是通过标志位的判定来解决线程通信。举个例子:春田花花幼儿园的小朋友们在午睡醒后会排队领取老师削皮的苹果,一人一个。今天老师睡过头了,醒来后没有时间削苹果,小朋友们已经排好队等着领取苹果,所以老师只能削好一个发一个。小朋友们排队依次等待老师发苹果,拿到苹果后才会走。
我在学习信号灯法的视频时发现弹幕上好多杠精,老师举了一个演员演节目,观众看节目的例子。好像触碰到了他们idol的禁区一样,各种抬杠,我都以为工地罢工了……
我这个例子不要杠,理解就好。非要杠的话我可以告诉你:第一篇笔记就说过我们只研究单个CPU的情况,多个老师削苹果是多个CPU同时工作;不要问我睡醒以后吃水果是否健康,免费的笔记看不惯没求着你看;不要说小朋友们等不耐烦了不要苹果怎么办,那是你自己手动关掉线程或者线程等待时间过长线程卡死系统报错。所以说不要杠我的笔记,爱看不看!
线程池
我们在使用线程的时候,如果要使用特别多的资源,可能会需要很多的线程,甚至有些时候线程被创建出来执行一次后就被销毁,这种情况在线程的创建和销毁的时候会浪费大量的资源。如果我们能够事先创建一些线程存储起来,需要用的时候拿出来,使用结束后放回去以供下次使用。
线程池就是这种作用,如果想了解更多就去看一看GOF23中设计模式中单例模式的特殊变种——有限多例模式。
总结
一个很懒的博主又糊弄完了一个知识点的笔记,哈哈哈,线程需要一定的基础,最后再建议一次:一定要看一下操作系统概述,这篇笔记中记录了线程方面的基础概念以及知识点,理论什么的也有涉及,所以大家可以回顾看一下这一片笔记。
下一阶段会讲解集合或者网络编程,大家等更新吧。