多线程19:生产者消费者模式

生产者消费者模式:
之前学的线程都是一条一条往下执行的,互不相干,互不影响,最多在线程设置一个flag外部标志位,让线程停下来。但没有涉及到线程之间的协作和通信。怎么能让线程之间能够交流?怎么让我等待的时候,让你去做一些事情呢?这个就非常难了,join()、yield()、等等都做不到,于是乎,出现了很著名的生产者和消费者模式,它不是23种设计模式之一,之前说的静态代理才是设计模式之一,它是一个问题,并不是一个模式。
生产者消费者,见名知意,首先得有两个对象吧,比如说生产者生产东西,生产了一个吃的。来说个最简单的例子吧,平时去麦当劳吃饭,首先有个前台,你要去的话你是个消费者,你是花钱的,你是消费者。里面有吃的,比如有只鸡,你进去拿你说你要只鸡他就会给你。如果他现在没有鸡了,他卖完了,他就会通知后面的厨子(生产者,生产鸡的人)去做,大厨做的时候你就得等,做好了给前台,前台通知你,哦,你来拿鸡了。
放在线程里,生产者是一条线程,消费者是一条线程,中间有一个产品,有产品的话就去通知,没有的话等待,两条线程就互相等,你等我,我等你,产生了一些协作。
 
线程通信:
  • 应用场景:生产者消费者问题
    • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费.
    • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止.
    • 如果产品中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库再次放入产品为止.
线程通信-分析:
  • 这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件.
    • 对于生产者,没有产品之前,要通知消费者等待。而生产了产品之后,又需要马上通知消费者消费
    • 对于消费者,在消费之后,要通知生产者已经结束消费,需要生产新的产品以供另外的消费者来消费
    • 在生产者消费者问题中,仅有synchronized是不够的
      • synchronized 可阻止并发更新同一个资源,实现了同步
      • synchronized 不能用来实现不同线程之间的消息传递(通信)

Java提供了几个方法解决线程之间的通信问题

解决方式1:
并发协作模型"生产者/消费者模式"--->管程法
   生产者:负责生产数据的模块(可能是方法,对象,线程,进程)

   消费者:负责处理数据的模块(可能是方法,对象,线程,进程)

   缓冲区:消费者不能直接使用生产者的数据,他们之间有个缓冲区,生产者将生产好的数据放入缓冲区,消费者从缓冲区拿出数据

 

解决方式2:
并发协作模型"生产者/消费这模式"-->信号灯法
  • 来判断一个标志位flag,如果为true,就让他等待、如果为false,就让他去通知另外一个人、把两人衔接起来,就像咱们的信号灯红灯停,绿灯行,通过这样一个判断方式,只要来判断什么时候让他等待,什么时候将他唤醒就ok。
posted @ 2020-02-04 19:51  断浮  阅读(239)  评论(0编辑  收藏  举报