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实现生产者消费者模式
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...
随机推荐
- mysql数据库忘记密码时如何修改(转)
当我们忘记mysql数据库密码时我们就无法正常进入数据库,也就无法修改密码,那么这时该怎么修改密码呢,这里教大家一个简单常用修改密码的方式. (如果图简单快速修改密码的话,直接跳过查询步骤,依照图上执 ...
- spring mvc笔记
80214shuenjian224shuenjian@sina 北风网公开课课程大纲1.学习MVC框架的步骤2.Spring MVC运行机制3.演示Spring MVCAdd Maven suppor ...
- 关于python的深浅拷贝、赋值
https://blog.csdn.net/weixin_39750084/article/details/81435454
- 3、Unicode\UTF-8\GBK 区别和联系
字符编码:Unicode和UTF-8之间的关系 可以参考下面blog:https://blog.csdn.net/xiaolei1021/article/details/52093706/ 这篇文章写 ...
- Web网站架构演变—高并发、大数据
转 Web网站架构演变—高并发.大数据 2018年07月25日 17:27:22 gis_morningsun 阅读数:599 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系 ...
- nodejs+express4.0+mongodb安装方法 for Linux, Mac
废话不多说 1:下载nodejs包 下载地址例如以下:http://www.nodejs.org/download/ 下载source code版本号须要解压后到其文件夹运行./configure,然 ...
- VC/MFC中为程序定义全局快捷键
VC 2010-05-01 18:01:34 阅读287 评论0 字号:大中小 订阅 1.注册快捷键 在初始化函数,如OnInitDialog() 注册快捷键,代码如下: #define HotKey ...
- [AngularFire2] Building an Authentication Observable Data Service
After successfully login, we want something help to check whether user has already login or not. And ...
- Fragment之一:Fragment入门 分类: H1_ANDROID 2013-11-15 18:16 2799人阅读 评论(2) 收藏
参考自张泽华视频 Fragment是自Android3.0后引入的特性,主要用于在不同的屏幕尺寸中展现不同的内容. Fragment必须被嵌入Activity中使用,总是作为Activity的组成部分 ...
- MySQL数据库定时自动备份脚本
Web系统,最重要的事项就是数据库的安全性和完整性. 定时做好备份,非常重要,千万不要在这个问题上偷懒.如果你的重要数据丢失了,会让你欲哭无泪. 导出表结构和数据 mysqldump -uroot ...