zoukankan      html  css  js  c++  java
  • 【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.信号灯法

  • 相关阅读:
    【1】windows下IOS开发基础环境搭建
    【oracle常见错误】oracle监听程序配置/“ORA-12541: TNS: 无监听程序”
    【oracle】oracle REGEXP_SUBSTR分割字符串
    【Oracle安装卸载】oracle卸载
    【oracle】一些的常用命令
    oracle备份与还原(导入导出)
    oracle导入时提示IMP-00010:不是有效的导出文件,头部验证失败
    oracle表空间扩容
    oracle实现like多关键字查询
    __builtin_ _Find_first()
  • 原文地址:https://www.cnblogs.com/chengkuan/p/13332707.html
Copyright © 2011-2022 走看看