java-线程-生产者-消费者
概述
在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-线程-生产者-消费者的更多相关文章
- java 线程 生产者-消费者与队列,任务间使用管道进行输入、输出 解说演示样例 --thinking java4
package org.rui.thread.block2; import java.io.BufferedReader; import java.io.IOException; import jav ...
- Java实现生产者消费者问题与读者写者问题
摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...
- Java基础 线程的通信的三个方法/ 交替数数线程 / 生产者&消费者线程问题
线程通讯笔记: /** 线程通信 三个方法: * wait(): 调用该方法 是该调用的方法的线程释放共享资源的锁,进入等待状态,直至被唤醒 * notify() : 可以唤醒队列中的第一个等待同一共 ...
- Java设计模式—生产者消费者模式(阻塞队列实现)
生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...
- Java-J2SE学习笔记-线程-生产者消费者问题
一.概述 模拟生产者消费者问题 二.代码 1.Consumer.java 2.Producer.java 3.SyncStack.java 4.Test.java 1.Consumer.java pa ...
- java实现生产者消费者问题
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...
- Java实现生产者消费者
方法1:最简单--利用LinkedBlockingQueue 队列具有先进先出的特点,成为经常应用于生产-消费者模式的数据结构. 1.将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点. —— ...
- java实现生产者消费者问题(转)
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...
- [转载] Java实现生产者消费者问题
转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费 ...
- java实现生产者消费者模式
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...
随机推荐
- 导出查询结果到csv文件
set colsep , set feedback off set heading off set trimout on spool my.csv select * from emp ...
- 不在JPA 的 persistence.xml 文件中配置Entity class的解决办法
在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,2种方法可以解决此问题: 这2种方式都可以实现不用在persiste ...
- js进阶 13-5 jquery队列动画如何实现
js进阶 13-5 jquery队列动画如何实现 一.总结 一句话总结:同一个jquery对象,直接写多个animate()就好. 1.什么是队列动画? 比如说先左再下,而不是左下一起走 2.怎么实现 ...
- 机器学习分支:active learning、incremental learning、online machine learning
1. active learning Active learning 是一种特殊形式的半监督机器学习方法,该方法允许交互式地询问用户(或者其他形式的信息源 information source)以获取 ...
- numpy,scipy,pandas 和 matplotlib
numpy,scipy,pandas 和 matplotlib 本文会介绍numpy,scipy,pandas 和 matplotlib 的安装,环境为Windows10. 一般情况下,如果安装了Py ...
- 未能加载文件或程序集“System.Collections.Concurrent”或它的某一个依赖项。
未能加载文件或程序集“XXXXXX”或它的某一个依赖项.试图加载格式不正确的程序. 在本机WIN7机器上的WebService部署到Win2008R2上发现错误 “/”应用程序中的服务器错误. 未 ...
- trunc与round
TRUNC(number[,num_digits]) number 需要截尾取整的数字. num_digits 用于指定取整精度的数字.Num_digits 的默认值为 0. 作用:截断数字和时间 ...
- AndroidActivity跳转动画,让你的APP瞬间绚丽起来
我们都知道绚丽的APP总会给用户耳目一新的感觉,为了抓住用户更大网络公司使出浑身解数让自己的产品更绚丽,而绚丽最简单的效果就是Activity跳转效果,不仅能够让用户看起来舒服,并且实现起来也特别简单 ...
- php课程 9-33 php文件操作里面的注意事项有哪些
php课程 9-33 php文件操作里面的注意事项有哪些 一.总结 一句话总结:文件操作其实很简单,就是几个文件操作函数需要记一下. 1.文件函数如何使用(如何找php文件函数的资料)? 查看参考手册 ...
- vue 用 :style动态修改带中划线的样式属性
今天在项目中遇到要用:style动态设置margin-top值,直接写发现报错.后来改成驼峰就成功了,记录一下 错误示范: <div class="testLeft ulData&qu ...