码迷,mamicode.com
首页 > 编程语言 > 详细

【JAVA SE基础篇】60.线程协作

时间:2020-07-27 13:43:48      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:技术   同步问题   表示   png   http   消息传递   块代码   类的方法   优先级   

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.信号灯法

技术图片

 

【JAVA SE基础篇】60.线程协作

标签:技术   同步问题   表示   png   http   消息传递   块代码   类的方法   优先级   

原文地址:https://www.cnblogs.com/chengkuan/p/13332707.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!