/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package testdemo1; import java.util.logging.Level;
import java.util.logging.Logger; class Mantou { private int id; public Mantou(int val) {
this.id = val;
} public String toString() {
return "Mantou id: " + this.id;
}
} class Basket { private Mantou[] mStack = new Mantou[6];
private int index = 0; public synchronized void push(Mantou m) {
while (index == mStack.length) {
try {
this.wait();
System.out.println("full........................!!!"); } catch (InterruptedException ex) {
Logger.getLogger(Basket.class.getName()).log(Level.SEVERE, null, ex);
}
}
this.notify(); mStack[index] = m; index++; System.out.println("add Mantou id= " + m + " and index= " + index); } public synchronized Mantou pop() { while (index == 0) { try {
System.out.println("empty........................!!!");
wait();
} catch (InterruptedException ex) {
Logger.getLogger(Basket.class.getName()).log(Level.SEVERE, null, ex);
}
}
this.notify();
index--;
Mantou m = mStack[index];
System.out.println("get Mantou id= " + m + " and index= " + index); return m;
}
} class Producer implements Runnable { private Basket brasket = new Basket(); public Producer(Basket val) {
this.brasket = val;
} @Override
public void run() {
for (int i = 0; i < 20; i++) {
Mantou m = new Mantou(i);
brasket.push(m); try {
// Thread.sleep(Math);
Thread.sleep((int) (Math.random() * 500));
} catch (InterruptedException ex) {
Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);
} }
} } class Consumer implements Runnable { private Basket brasket = new Basket(); public Consumer(Basket val) {
this.brasket = val;
} @Override
public void run() {
for (int i = 0; i < 20; i++) {
Mantou m = brasket.pop();
try {
Thread.sleep((int) (Math.random() * 1000));
} catch (InterruptedException ex) {
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
} public class TestDemo1 { public static void main(String[] args) {
// TODO code application logic here
Basket s = new Basket();
Producer producer = new Producer(s);
Consumer consumer = new Consumer(s);
Thread tr1 = new Thread(producer);
Thread tr2 = new Thread(consumer);
tr1.start();
tr2.start();
} }

Java_生产者消费者模式的更多相关文章

  1. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  2. LabVIEW之生产者/消费者模式--队列操作 彭会锋

    LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...

  3. 转:Task任务调度实现生产者消费者模式 (个人理解后文)

    纯属个人愚见.欢迎加入反驳(PiDou). 1.前文大致就是,利用Queue配置的一个TaskFactory任务调度器.实现生产者消费者模式的例子..首先我就试了 第一种 FIFO(先进先出)的配置. ...

  4. Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  5. MVC异常日志生产者消费者模式记录(异常过滤器)

    生产者消费者模式 定义自己的异常过滤器并注册 namespace Eco.Web.App.Models { public class MyExceptionAttribute : HandleErro ...

  6. 转:Task任务调度实现生产者消费者模式

    我们经常会遇到生产者消费者模式,比如前端各种UI操作事件触发后台逻辑等.在这种典型的应用场景中,我们可能会有4个业务处理逻辑(下文以P代表生产者,C代表消费者): 1. FIFO(先进先出)      ...

  7. .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法

    1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...

  8. 使用BlockingQueue的生产者消费者模式

    BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.使用场景. 首先它是一个队列,而一个队 ...

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

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

随机推荐

  1. pl/sql developer 编码格式设置

    pl/sql developer编码格式设置   一.pl/sql developer 中文字段显示乱码  原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的. 二. ...

  2. Entity Framework中查看生成的SQL语句

    Entity Framework 4.0 中是这样的,高版本的跟这个有些差异,不太一样,貌似已经到7了 using (Entities entities = new Entities()) { var ...

  3. Poj 2081 Recaman's Sequence之解题报告

                                                                                                         ...

  4. Jquery+bootstrap实现静态博客主题

    来源:个人博客     body部分:   side部分:     文章页面: 下载链接:             Fork Git: https://github.com/dwqs/theme1   ...

  5. jqgrid 设置单元格编辑/不可编辑

    首先设置不可编辑,如下代码: $(', 'not-editable-cell'); 在单元格上设置一个'not-editable-cell'就可以了,如果需要设置为可编辑,那么可以使用下面的代码: f ...

  6. java日志,(commons-loging 、log4j 、slf4j 、LogBack介绍)

    如果对于commons-loging .log4j .slf4j .LogBack 等都已经非常清楚了,可以忽略本文.几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所 ...

  7. c语言中格式化输出函数的研究

    <一>; 1.前言 在gcc编程中,我们比较经常用到的字符格式化输出函数是printf的,实际上gcc继承了c语言处理字符具有强大功能的风格,它提供了一系列的格式化输出函数,主要存在两个库 ...

  8. Android中使用sqlite笔记

    1.实现SQLiteHelper来在android中使用SQLite.代码如下,来自android官网. public class FeedReaderDbHelper extends SQLiteO ...

  9. A Tour of Go Range continued

    You can skip the index or value by assigning to _. If you only want the index, drop the ", valu ...

  10. IOS-- UIView中的坐标转换

    // 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UI ...