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.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)可能出现的原因

    可能是因为你的服务器http连接过多,导致端口被占用,无法释放

  2. asp.net identity 2.2.0 在WebForm下的角色启用和基本使用(三)

    角色管理功能: 界面部分: <%@ Page Title="" Language="C#" MasterPageFile="~/Site.mas ...

  3. 掌握Thinkphp3.2.0----连贯操作

    其实在TP中,说起来语句中的各个关键词都被封装成了函数,将各个由关键词演变来的函数连起来就是所谓的连贯操作.只要注意各个函数直接参数传递的区别就可以了. 再者,不是所有的函数都可以进行连贯操作!!!比 ...

  4. test hypertext links for validity, accessibility, and recent modification

    https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html The HEAD method is identical to GET except th ...

  5. ubuntu 更改时区

    更改/etc/timezone Asia/Chongqing sudo dpkg-reconfigure tzdata

  6. JsonProperties对模型返回的应用

    在采用springMvc+Mybatis的架构中.数据库已经建好,数据库和需要返回的实体共用一个model.一切都井然有序,看起来很美好. 返回的代码都如下这样 @RequestMapping(&qu ...

  7. 使用intellij的svn时提示出错: Can't use Subversion command line client: svn.Errors found while svn working copies detection.

    使用Intellij的svn时提示出错:Can't use Subversion command line client: svn. Errors found while svn working co ...

  8. Date.prototype.format

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...

  9. iOS,视图相关

    1.移除视图的所以子视图 2.自定义视图(UIView) 3.处理悬浮窗口(类似微信视频),等比缩放 4.自定义前面视图(可以手写字) 5.图片拉伸的几种方式,计算文本占用空间大小 6.UILable ...

  10. composer [ReflectionException] Class Fxp\Composer\AssetPlugin\Repository\NpmRepository does not exist

    在执行composer update时报错 [ReflectionException]Class Fxp\Composer\AssetPlugin\Repository\NpmRepository d ...