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

 

posted @ 2020-07-27 11:02  CKuan  阅读(164)  评论(0编辑  收藏  举报