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多线程 生产者消费者模式的更多相关文章

  1. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  2. Java实现多线程生产者消费者模式的两种方法

    生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...

  3. java实现多线程生产者消费者模式

    1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...

  4. Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...

  5. 关于java中生产者消费者模式的理解

    在说生产者消费者模式之前,我觉得有必要理解一下 Obj.wait(),与Obj.notify()方法.wait()方法是指在持有对象锁的线程调用此方法时,会释放对象锁,同时休眠本线程.notify() ...

  6. java 实现生产者-消费者模式

    生产和消费者模式有很多种,现在介绍几种常见的方式 wait/notify实现生产和消费者模式 1.使用wait/notify实现生产和消费者模式: public class Depot { // 实际 ...

  7. java实现生产者消费者模式

    生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...

  8. java——利用生产者消费者模式思想实现简易版handler机制

    参考教程:http://www.sohu.com/a/237792762_659256 首先说一下这里面涉及到的线程: 1.mainLooper: 这个线程可以理解为消费者线程,里面运行了一个死循环, ...

  9. java多线程 生产者消费者案例-虚假唤醒

    package com.java.juc; public class TestProductAndConsumer { public static void main(String[] args) { ...

随机推荐

  1. Java POI导入导出Excel

    1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...

  2. 不断优化,重构我的代码-----拖拽jquery插件

    最近学东西学的有点太散了,歇一阵子,重新完善之前的JQ插件,今天先上拖拽吧 // JavaScript Document (function($){ var defaults = { actionEl ...

  3. 几何服务,cut功能,输入要素target(修改后)内容。

    几何服务,cut功能测试,输入要素target(修改后)内容. {"displayFieldName":"","fieldAliases": ...

  4. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  5. centos6.7下安装mvn 、安装elasticsearch下ik分词

    先说一下安装mvn步骤,如果已安装可以忽略: 在tmp目录下 1.建立mvn目录 mkdir mvn cd /tmp/mvn 2.下载 wget http://apache.fayea.com/mav ...

  6. GridView实现方块布局

    效果如下: 先创建一个BaseViewHolder package com.example.griddemo; import android.util.SparseArray; import andr ...

  7. SqlServer删除表中重复记录

    重复记录:有两个意义上的重复记录 一是完全重复的记录,也即所有字段均重复的记录: 二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略. 1.对于第一种重复,比较容易 ...

  8. oracle or语句的坑

    SELECT SUM(tjo.pay_amount) FROM tb_jf_order tjo,tb_jf_gateway_trade_log tjg WHERE tjo.order_id = tjg ...

  9. 利用paramiko模块实现堡垒机+审计功能

    paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...

  10. C#并行编程之数据并行

    所谓的数据并行的条件是: 1.拥有大量的数据. 2.对数据的逻辑操作都是一致的. 3.数据之间没有顺序依赖. 运行并行编程可以充分的利用现在多核计算机的优势.记录代码如下: public class ...