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) { ...
随机推荐
- bzoj 4445 [SCOI2015] 小凸想跑步
题目大意:一个凸包,随机一个点使得其与前两个点组成的面积比与其他相邻两个点组成的面积小的概率 根据题意列方程,最后求n条直线的交的面积与原凸包面积的比值 #include<bits/stdc++ ...
- Visual Studio 2010编译时总是提示"调用目标发生了异常"的解决
现象: 无论建立的是Win32 Console的解决方案,还是MFC的解决方案,重新打开Visual Studio 2010之后,编译时总是提示“调用的目标发生了异常” 解决: 1. 关闭Visual ...
- PostGr-SQL database创建表
postgres=# create database vertigo_sandbox; postgres=# \connect vertigo_sandbox vertigo_sandbox=# CR ...
- Nginx中FastCGI配置优化
FastCGI: FastCGI是从CGI发展改进而来的.传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器 ...
- Oracle数据库基础知识2
字符操作相关_1 1.CONCAT关键字作用:连接字符串语法:CONCAT(字串1, 字串2)例如: CONCAT('hello','world') FROM DUAL; 注意:Oracle的CONC ...
- Linq分组
1.lin语句 int[] nums = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0, 3 }; DataTable table = new DataTable("Numb ...
- cloudera learning6:Hadoop Security
保证Hadoop安全的最有效方法是对cluster进行隔离(isolation,常用方法是把大集群划分若干个小集群). Hadoop安全措施的目的是防止好的人不小心做了坏的事,而非防止坏人坏事. Ke ...
- java中一个查询业务的流程
因为有用到分页,首先建一个page类 1 public class Page<T> { 2 private int pageSize; //每页显示条数 3 private int cur ...
- JMeter学习-026-JMeter 分布式(远程)参数化测试实例
以前文所述对文章详情的HTTP请求进行性能测试为例.日常实际场景中,不可能所有的人都在同时访问一篇文章,而是多人访问不同的文章,因而需要对文章编号进行参数化,以更好的模拟日常的性能测试场景.同时,因文 ...
- 【leedcode】 Median of Two Sorted Arrays
https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 and num ...