概述

在Java中有四种方法支持同步,其中前三个是同步方法,一个是管道方法。
wait() / notify()方法
await() / signal()方法
BlockingQueue阻塞队列方法
PipedInputStream / PipedOutputStream

wait() / notify()方法

public class Storage {private final int MAX_SIZE = 100;private LinkedList<Object> list = new LinkedList<>();private synchronized void produce(String producer) {while (list.size() >= MAX_SIZE) {System.out.println("仓库已满,【" + producer + "】: 暂时不能执行生产任务!");try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}list.add(new Object());this.notifyAll();}private synchronized void consume(String consumer) {while (list.size() == 0) {System.out.println("仓库已空,【" + consumer + "】: 暂时不能执行消费任务!");try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}list.remove();this.notifyAll();}
}public class Producer extends Thread {private String producer;private Storage storage;public Producer(Storage storage) {this.storage = storage;}@Overridepublic void run() {while (true) {produce(producer);}}public void produce(String producer) {storage.produce(producer);}public String getProducer() {return producer;}public void setProducer(String producer) {this.producer = producer;}public Storage getStorage() {return storage;}public void setStorage(Storage storage) {this.storage = storage;}}public class Consumer extends Thread {private String consumer;private Storage storage;public Consumer(Storage storage) {this.storage = storage;}@Overridepublic void run() {while (true) {consume(consumer);}}public void consume(String consumer) {storage.consume(consumer);}public Storage getStorage() {return storage;}public void setStorage(Storage storage) {this.storage = storage;}public String getConsumer() {return consumer;}public void setConsumer(String consumer) {this.consumer = consumer;}}

await() / signal()方法

public class StorageLock {private Lock lock = new ReentrantLock();private Condition fullCondition = lock.newCondition();private Condition emptyCondition = lock.newCondition();private final int MAX_SIZE = 10;private LinkedList<Object> list = new LinkedList<>();public void produce(String name) {try {lock.lock();while (list.size() == MAX_SIZE) {fullCondition.await();System.out.println("仓库已满," + name + "暂停生产");}list.add(new Object());System.out.println(name + "生产一个,当前仓库容量" + list.size());emptyCondition.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void consume(String name) {try {lock.lock();while (list.size() == 0) {emptyCondition.await();System.out.println("仓库以空," + name + "暂停消费");}list.remove();System.out.println(name + "消费一个,当前仓库容量" + list.size());fullCondition.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}

BlockingQueue阻塞队列方法


public class BlockStorage {private final int MAX_SIZE = 10;private ArrayBlockingQueue<Object> list = new ArrayBlockingQueue<Object>(MAX_SIZE);public void produce(String name) throws InterruptedException {if(list.size() == MAX_SIZE){System.out.println("仓库已满,【" + name + "】: 暂时不能执行生产任务!");}list.put(new Object());System.out.println("【" + name + "】:生产了一个产品\t【现仓储量为】:" + list.size());}public void consume(String name) throws InterruptedException {if(list.size() == 0){System.out.println("仓库空,【" + name + "】: 暂时不能执行消费任务!");}list.take();System.out.println("【" + name + "】:消费了一个产品\t【现仓储量为】:" + list.size());}}

转载于:https://www.cnblogs.com/xckxue/p/8745124.html

java-线程-生产者-消费者相关推荐

  1. Java线程生产者消费者问题详解

    问题描述         生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.生产 ...

  2. Java多线程-生产者消费者问题(多个消费者多个生产者)

    Java多线程-生产者消费者问题(多个消费者多个生产者) public class ConsumerProcuderDemo {public static void main(String[] arg ...

  3. 【Java】生产者消费者模型

    [Java]生产者消费者模型 0x1 前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间 ...

  4. java实现生产者消费者模式

    一: 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直 ...

  5. 【Java】生产者消费者模式的三种实现

    原文地址:https://blog.csdn.net/u010983881/article/details/78554671 前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内 ...

  6. 【Java】生产者消费者模式的实现

    前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力.这个 ...

  7. java实现生产者消费者问题(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  8. 基于JAVA的生产者消费者问题

    一.需求分析 为了更好地理解进程同步的机制和过程,决定设计实现生产者消费者问题的解决,以实现进程的同步控制. 题目描述:有n个生产者在生产产品,这些产品将提供给m个消费者去消费,为了使生产者和消费者能 ...

  9. Java多线程生产者消费者调度实现

    生产者消费者模型是多线程中最常见的模型,有着广泛的应用.其主要目的是实现一种动态的平衡,让生产者消费者和谐共处,获得最大化的执行效率. 所说的动态平衡其实就是生产者与消费者协作控制仓储,让消费者不至于 ...

  10. java 生产者消费者_基于JAVA的生产者消费者问题

    一.需求分析 为了更好地理解进程同步的机制和过程,决定设计实现生产者消费者问题的解决,以实现进程的同步控制. 题目描述:有n个生产者在生产产品,这些产品将提供给m个消费者去消费,为了使生产者和消费者能 ...

最新文章

  1. 北航学长的《数据竞赛入门讲义》分享:我是靠这些拿到冠军的
  2. tp5循环查询语句_如何用Excel快速生成SQL语句,用过的人都说好
  3. mysql用户创建,及授权
  4. python - EDA - 1 统计缺失值
  5. java监听上传文件,Springmvc文件上传监听详解
  6. 开源视频平台:Kaltura
  7. 爬虫(二)-创建项目应用
  8. matlab 单相整流电路,MATLAB的单相桥式整流电路研究
  9. Q4营收同比增长34.7%,Saleforces股价为何总停滞不前?
  10. 图像处理之3d算法----2d转3d算法介绍
  11. 苹果电脑/macbookpro 拔出电源充电器但还是显示充电的解决办法
  12. (附源码)spring boot校园管理系统 毕业设计 021104
  13. 关于SAP十个常见问题集锦
  14. DHCP两种地址池与中继的理解与应用【eNSP实现】
  15. 构建能源物联网,助力电力物联网数据服务
  16. 投骰子游戏(C++)
  17. poj 1737 Connected Graph
  18. Java0基础学习笔记、心得-day01(Java入门需知、Java入门概述、Java语言相关知识、JDK与JRE关系,常用DOS命令、JDK的下载安装与HelloWorld案例实现与常见问题。)
  19. MSSQL2008数据库备份与还原
  20. Python 读取 支付宝账单并存储到 Access 中

热门文章

  1. Linux下获取文件编译的时间
  2. php wdatepicker,WdatePicker时间控件的使用
  3. python网络爬虫系列(八)——常见的反爬手段和解决方法
  4. ZooKeeper 保证数据一致性
  5. LeetCode 911. 在线选举(二分查找)
  6. LeetCode 679. 24 点游戏(回溯)
  7. [scikit-learn 机器学习] 8. 非线性分类和决策树
  8. LeetCode 1260. 二维网格迁移(二维转一维)
  9. PHP动态验证,php-动态更改验证规则
  10. 策略模式java 用例_java策略模式简单用例