java多线程 生产者消费者模式
package de.bvb; /**
* 生产者消费者模式
* 通过 wait() 和 notify() 通信方法实现
*
*/
public class Test1 {
public static void main(String[] args) {
Godown godown = new Godown(50);
for (int i = 0; i < 5; i++) {
new ProducerThread(i * 10, godown).start();
new ConsumerThread(i * 10, godown).start();
}
}
} /** 仓库 */
class Godown {
public static final int max_size = 100; // 最大库存量
public int currentSize; // 当前库存 public Godown(int currentSize) {
this.currentSize = currentSize;
} // 生产指定数量的产品
public synchronized void produce(int size) {
try {
while (currentSize + size > max_size) { // 不满足生产的条件
System.out.println("要生产的产品数量" + size + "超过剩余库容量"
+ (max_size - currentSize) + ",暂时不能执行生产任务!");
// 当前的生产线程等待
wait();
}
// 满足生产条件,则进行生产,这里简单的更改当前库存量
currentSize += size;
System.out.println("生产前仓储量为:" + (currentSize - size) + ";生产了"
+ size + "个产品,现仓储量为" + currentSize);
// 唤醒在此对象监视器上等待的所有线程
notifyAll();
} catch (Exception e) {
e.printStackTrace();
}
} // 消费指定数量的产品
public synchronized void consume(int size) {
try {
while (currentSize < size) { // 不满足消费的条件
System.out.println("要消费的产品数量" + size + "超过剩余库存量"
+ (currentSize) + ",暂时不能执行消费任务!");
// 当前的生产线程等待
wait();
}
// 满足生产条件,则进行生产,这里简单的更改当前库存量
currentSize -= size;
System.out.println("消费前的仓储量为" + (currentSize + size) + ";已经消费了"
+ size + "个产品,现仓储量为" + currentSize);
// 唤醒在此对象监视器上等待的所有线程
notifyAll();
} catch (Exception e) {
e.printStackTrace();
}
}
} /** 生产者线程 */
class ProducerThread extends Thread {
private int size;
private Godown godown; public ProducerThread(int size, Godown godown) {
super();
this.size = size;
this.godown = godown;
} @Override
public void run() {
godown.produce(size);
}
} class ConsumerThread extends Thread {
private int size;
private Godown godown; public ConsumerThread(int size, Godown godown) {
super();
this.size = size;
this.godown = godown;
} @Override
public void run() {
godown.consume(size);
}
}
java多线程 生产者消费者模式的更多相关文章
- java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】
java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...
- Java实现多线程生产者消费者模式的两种方法
生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...
- java实现多线程生产者消费者模式
1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...
- Java设计模式—生产者消费者模式(阻塞队列实现)
生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...
- 关于java中生产者消费者模式的理解
在说生产者消费者模式之前,我觉得有必要理解一下 Obj.wait(),与Obj.notify()方法.wait()方法是指在持有对象锁的线程调用此方法时,会释放对象锁,同时休眠本线程.notify() ...
- java 实现生产者-消费者模式
生产和消费者模式有很多种,现在介绍几种常见的方式 wait/notify实现生产和消费者模式 1.使用wait/notify实现生产和消费者模式: public class Depot { // 实际 ...
- java实现生产者消费者模式
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...
- java——利用生产者消费者模式思想实现简易版handler机制
参考教程:http://www.sohu.com/a/237792762_659256 首先说一下这里面涉及到的线程: 1.mainLooper: 这个线程可以理解为消费者线程,里面运行了一个死循环, ...
- java多线程 生产者消费者案例-虚假唤醒
package com.java.juc; public class TestProductAndConsumer { public static void main(String[] args) { ...
随机推荐
- NGUI渲染流程
1 渲染流程 NGUI的渲染流程其实就是把Widget组件生成Mesh所需要的缓存数据,然后生成对应的DrallCall组合对应数据,生成渲染需要的Mesh数据,提交渲染. Widget(数据) UI ...
- .net web 小基累
获取当前网站的根目录:HttpContext.Current.Request.PhysicalApplicationPath+“Content”
- oauth基本流程和原理
组装loginurl->去第三方登录验证->回调callbackurl+code(票据)->本地根据code+appid+appkey组装url隐式curl获取用户信息->完成 ...
- 浅谈java抽象类和接口
第一次,写这个,没有把图片放上来,有兴趣的可以点击连接看原文 http://note.youdao.com/noteshare?id=aecbd52b9240f23c0954e8086b848a17 ...
- js数组去重的hash方法
对于 JavaScript 数组去除重复项,现在有多种方法,其中一种是hash,如下: if (!Array.prototype.unique) { Array.prototype.unique = ...
- macOS sierra 10.12 Cocoapods 私有库
使用Cocoapods创建私有podspec 见文章:http://www.cocoachina.com/ios/20150228/11206.html 或http://blog.wtlucky.co ...
- HP ALM 使用经验
使用HP ALM(Application Lifecycle Management)软件有一个多月的时间了,我是从安装,部署,建项,配置,使用,再到问题收集,这个过程过来的.发现ALM是一个功能确实强 ...
- 使用 apache2 + `mod_proxy_uwsgi` + uwsgi + upstart 部署
使用 apache2 + mod_proxy_uwsgi + uwsgi + upstart 部署 网上运行 python wsgi 的应用时,大部分的资料都是使用 nginx .uwsgi ,很少资 ...
- java8 学习系列--NIO学习笔记
近期有点时间,决定学习下java8相关的内容: 当然了不止java8中新增的功能点,整个JDK都需要自己研究的,不过这是个漫长的过程吧,以自己的惰性来看: 不过开发中不是有时候讲究模块化开发么,那么我 ...
- Autorelease自动释放池的使用
Autorelease自动释放池的使用 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain.release和autorelease. MRC内存管理原则:谁申请,谁释放 遇到al ...