概述

在Java中有四种方法支持同步,其中前三个是同步方法,一个是管道方法。

wait() / notify()方法

await() / signal()方法

BlockingQueue阻塞队列方法

PipedInputStream / PipedOutputStream

wait() / notify()方法

  1. public class Storage {
  2. private final int MAX_SIZE = 100;
  3. private LinkedList<Object> list = new LinkedList<>();
  4. private synchronized void produce(String producer) {
  5. while (list.size() >= MAX_SIZE) {
  6. System.out.println("仓库已满,【" + producer + "】: 暂时不能执行生产任务!");
  7. try {
  8. this.wait();
  9. } catch (InterruptedException e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. list.add(new Object());
  14. this.notifyAll();
  15. }
  16. private synchronized void consume(String consumer) {
  17. while (list.size() == 0) {
  18. System.out.println("仓库已空,【" + consumer + "】: 暂时不能执行消费任务!");
  19. try {
  20. this.wait();
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. list.remove();
  26. this.notifyAll();
  27. }
  28. }
  29. public class Producer extends Thread {
  30. private String producer;
  31. private Storage storage;
  32. public Producer(Storage storage) {
  33. this.storage = storage;
  34. }
  35. @Override
  36. public void run() {
  37. while (true) {
  38. produce(producer);
  39. }
  40. }
  41. public void produce(String producer) {
  42. storage.produce(producer);
  43. }
  44. public String getProducer() {
  45. return producer;
  46. }
  47. public void setProducer(String producer) {
  48. this.producer = producer;
  49. }
  50. public Storage getStorage() {
  51. return storage;
  52. }
  53. public void setStorage(Storage storage) {
  54. this.storage = storage;
  55. }
  56. }
  57. public class Consumer extends Thread {
  58. private String consumer;
  59. private Storage storage;
  60. public Consumer(Storage storage) {
  61. this.storage = storage;
  62. }
  63. @Override
  64. public void run() {
  65. while (true) {
  66. consume(consumer);
  67. }
  68. }
  69. public void consume(String consumer) {
  70. storage.consume(consumer);
  71. }
  72. public Storage getStorage() {
  73. return storage;
  74. }
  75. public void setStorage(Storage storage) {
  76. this.storage = storage;
  77. }
  78. public String getConsumer() {
  79. return consumer;
  80. }
  81. public void setConsumer(String consumer) {
  82. this.consumer = consumer;
  83. }
  84. }

await() / signal()方法

  1. public class StorageLock {
  2. private Lock lock = new ReentrantLock();
  3. private Condition fullCondition = lock.newCondition();
  4. private Condition emptyCondition = lock.newCondition();
  5. private final int MAX_SIZE = 10;
  6. private LinkedList<Object> list = new LinkedList<>();
  7. public void produce(String name) {
  8. try {
  9. lock.lock();
  10. while (list.size() == MAX_SIZE) {
  11. fullCondition.await();
  12. System.out.println("仓库已满," + name + "暂停生产");
  13. }
  14. list.add(new Object());
  15. System.out.println(name + "生产一个,当前仓库容量" + list.size());
  16. emptyCondition.signal();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. } finally {
  20. lock.unlock();
  21. }
  22. }
  23. public void consume(String name) {
  24. try {
  25. lock.lock();
  26. while (list.size() == 0) {
  27. emptyCondition.await();
  28. System.out.println("仓库以空," + name + "暂停消费");
  29. }
  30. list.remove();
  31. System.out.println(name + "消费一个,当前仓库容量" + list.size());
  32. fullCondition.signal();
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. } finally {
  36. lock.unlock();
  37. }
  38. }
  39. }

BlockingQueue阻塞队列方法


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

java-线程-生产者-消费者的更多相关文章

  1. java 线程 生产者-消费者与队列,任务间使用管道进行输入、输出 解说演示样例 --thinking java4

    package org.rui.thread.block2; import java.io.BufferedReader; import java.io.IOException; import jav ...

  2. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

  3. Java基础 线程的通信的三个方法/ 交替数数线程 / 生产者&消费者线程问题

    线程通讯笔记: /** 线程通信 三个方法: * wait(): 调用该方法 是该调用的方法的线程释放共享资源的锁,进入等待状态,直至被唤醒 * notify() : 可以唤醒队列中的第一个等待同一共 ...

  4. Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...

  5. Java-J2SE学习笔记-线程-生产者消费者问题

    一.概述 模拟生产者消费者问题 二.代码 1.Consumer.java 2.Producer.java 3.SyncStack.java 4.Test.java 1.Consumer.java pa ...

  6. java实现生产者消费者问题

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

  7. Java实现生产者消费者

    方法1:最简单--利用LinkedBlockingQueue 队列具有先进先出的特点,成为经常应用于生产-消费者模式的数据结构. 1.将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点. —— ...

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

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

  9. [转载] Java实现生产者消费者问题

    转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费 ...

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

    生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...

随机推荐

  1. localStorage存储数据位置

    chrome浏览器:C:\Users\Username\AppData\Local\Google\Chrome\User Data\Default\Local Storage 中,虽然后缀名是.loc ...

  2. web前端背景介绍

    Internet:是一个全球性的计算机互联网络,中文名称“因特网”.“国际互联网”.“网际网”等等: Internet提供的服务:http.ftp.Telnet.email.www.bbs等等: 基本 ...

  3. 【组件】微信小程序input搜索框的实现

    开发小程序的过程,是一个学习知识,解决问题的过程,每当实现了一个需求,总会有很大的成就感,每天记录一个开发过程中的细节.实现效果如下: 官方参考链接:https://developers.weixin ...

  4. Kaggle实战分类问题2

    Kaggle实战之二分类问题 0. 前言 1. MNIST 数据集 2. 二分类器 3. 效果评测 4. 多分类器与误差分析 5. Kaggle 实战 0. 前言 “尽管新技术新算法层出不穷,但是掌握 ...

  5. java set转list,数组与list的转换

    读zookeeper的源码(zookeeper.java)时发现的,平时没有怎么注意: private final ZKWatchManager watchManager; List<Strin ...

  6. Altium Designer布局移动原件的问题

  7. 学习笔记:Vue——混入

    前言: 到现在用Vue做了不少项目了,用到的都是初阶的功能,很多高阶能力都没有用到.仅用初级阶段也能做项目,甚至是复杂项目,可见vue之强大,果然是渐进式开发方式. 但是本着虚心学习的态度,还是要抽空 ...

  8. cocos2D(一)----第一个cocos2D程序

    简单介绍 我们这个专题要学习的是一款iOS平台的2D游戏引擎cocos2d.严格来说叫做cocos2d-iphone,由于cocos2d有非常多个版本号.我们学习的是iphone版本号的.既然是个游戏 ...

  9. 基于mpvue的小程序项目搭建的步骤一

    未标题-1.png mpvue 是美团开源的一套语法与vue.js一致的.快速开发小程序的前端框架,按官网说可以达到小程序与H5界面使用一套代码.使用此框架,开发者将得到完整的 Vue.js 开发体验 ...

  10. 【Codeforces Round #440 (Div. 2) A】 Search for Pretty Integers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先枚举一个数字的情况. 再枚举两个数的情况就好. [代码] #include <bits/stdc++.h> #defi ...