概述

在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;
} @Override
public 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;
} @Override
public 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());
} }

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. 洛谷 P1205 [USACO1.2]方块转换 Transformations

    P1205 [USACO1.2]方块转换 Transformations 题目描述 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始 ...

  2. POJ 1325 Machine Schedule(zoj 1364) 最小覆盖数

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=364 http://poj.org/problem?id=1325 题目大意: ...

  3. Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限

    泛型: 一种程序设计语言的新特性,于Java而言,在JDK 1.5开始引入.泛型就是在设计程序的时候定义一些可变部分,在具体使用的时候再给可变部分指定具体的类型.使用泛型比使用Object变量再进行强 ...

  4. uva_658_It&#39;s not a Bug, it&#39;s a Feature!(最短路)

    It's not a Bug, it's a Feature! Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & ...

  5. vim编辑器经常使用命令

    高级一些的编辑器,都会包括宏功能,vim当然不能缺少了.在vim中使用宏是很方便的: :qx     開始记录宏,并将结果存入寄存器xq     退出记录模式@x     播放记录在x寄存器中的宏命令 ...

  6. js进阶 12-14 jquery的事件触发函数是哪两个

    js进阶 12-14 jquery的事件触发函数是哪两个 一.总结 一句话总结:trigger和triggerHandler 1.trigger传额外参数时候的注意事项是什么? 注意样例中是三个参数 ...

  7. 9.10 Binder系统_Java实现_hello服务

    怎么做?2.1 定义接口: 写IHelloService.aidl文件, 上传, 编译, 得到IHelloService.java 里面有Stub : onTransact, 它会分辨收到数据然后调用 ...

  8. Windows中DLL文件的意义及其作用

    Windows中DLL文件的意义及其作用 DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和 ...

  9. DBeaver无法执行数据库脚本

    网上查了查相关问题,自己写了个步骤,记录下来方便以后查找 此处我连接的是mysql数据库,就以mysql为例说明: 在使用DBeaver过程中,别人给了几个sql文件,想直接导入数据库中,正常流程应该 ...

  10. [Nuxt] Add Arrays of Data to the Vuex Store and Display Them in Vue.js Templates

    You add array of todos to the store simply by adding them to the state defined in your store/index.j ...