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) { ...
随机推荐
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
- 12306订票助手.net版如何抢指定过路某一地点的火车票
12306订票助手.net版如何抢指定路过某一地点的火车票? 直接举例: 广州到武汉,很多高铁,经过清远,衡阳,郴州,长沙等地.需要从清远上车.操作步骤如下: 1.先查询清远-武汉,打开右下角的自动预 ...
- asp.net identity 2.2.0 在WebForm下的角色启用和基本使用(三)
角色管理功能: 界面部分: <%@ Page Title="" Language="C#" MasterPageFile="~/Site.mas ...
- 前端Javascript书籍分享
早前在公司曾做过一些关于前端的技术分享,而每每跟大家谈到深处时,大家会疑惑这些知识点从何而来. 我会经常在内部去推荐自己读过的好书,希望大家在技术层面上都能更上一个台阶. 今天写下这个帖子一方面是记录 ...
- ansible 安装
1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署. ...
- 出售一套Unity + Lua热更新框架代码
出售一套Unity + Lua的客户端框架代码,功能有资源管理.网络通信.配置文件解析.热更新.文件读写.Lua加密揭秘.UI框架.打包工具.编辑器工具等,已经在多个实际项目(已上线)中使用.代码优雅 ...
- laravel5 使用model 表名总是多个s
正常,如果不要s,请在model 指定表名. class user extend Model{ public $table='user';//这样寻找的就是没s的表 }
- Linux服务器上监控网络带宽的18个常用命令
[51CTO精选译文]本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量分开来显示. 一些命令可以 ...
- 用jsonp格式的数据进行ajax post请求变成get
因为 dataType 是 jsonp 而不是 json jsonp不支持POST跨域,所以会自动转成GET而关于jsonp为什么不支持post请求,百度到的答案是jsonp为动态的script,没有 ...
- 【转载】LR提交JSON格式的请求
需求: 测试一个“修改用户铜板”的接口,这个接口接收JSON格式的请求,返回JSON格式的结果: 必须用PUT方式提交请求: 提交内容: {"method":"modi ...