【JAVA SE基础篇】60.线程协作
1.生产者消费者模式
不属于23种设计模式,23种设计模式解决类于类之间的关系。该模式处理并发线程通信,线程协作。
应用场景:生产者和消费者的问题
假设:仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费
如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止;
如果仓库中有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止。
2.线程通信:
分析:这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间互相依赖,互为条件
1.对于生产者,没有生产产品之前,要通知消费者等待。而生产了产品之后,又需要马上通知消费者消费
2.对于消费者,在消费之后,要通知生产者已经消费结束,需要继续生产新的产品以供消费
3.在生产者消费者问题中,仅有synchronized是不够的
synchronized可阻止并发更新同一个共享资源,实现了同步
synchronized不能用来实现不同线程之间的消息传递(通信)
解决办法1:
并发协作模型"生产者/消费者模式"->管程法
1.生产者:负责生产数据的模块(方法,对象,线程,进程)
2.消费者:负责处理数据的模块(方法,对象,线程,进程)
3.缓冲区(Buffer共享内存):消费者不能直接使用生产者的数据,他们之间有个“缓冲区”
生产者将生产好的数据放入“缓冲区”,消费者从“缓冲区”拿要处理的数据。
解决办法2:
并发协作模型“生产者/消费者模式”->信号灯法
线程通信三个方法:
final void wait():表示线程等待,直到其他线程通知,与sleep不同,会释放锁
final void wait(long timeout):指定等待的毫秒数
final void notifiy():唤醒一个处于等待状态的线程
final void notifyAll():唤醒同一个对象上的所有调用wait()方法的线程,优先级别高的线程优先度高
注:均属于java.lang.Object类的方法,都只能在同步方法和同步块代码中使用,否则会抛出异常。
3.管程法
1.生产者
2.消费者
3.缓冲区
4.信号灯法