Java_生产者消费者模式
/*
* 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_生产者消费者模式的更多相关文章
- java多线程 生产者消费者模式
package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...
- LabVIEW之生产者/消费者模式--队列操作 彭会锋
LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...
- 转:Task任务调度实现生产者消费者模式 (个人理解后文)
纯属个人愚见.欢迎加入反驳(PiDou). 1.前文大致就是,利用Queue配置的一个TaskFactory任务调度器.实现生产者消费者模式的例子..首先我就试了 第一种 FIFO(先进先出)的配置. ...
- Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- MVC异常日志生产者消费者模式记录(异常过滤器)
生产者消费者模式 定义自己的异常过滤器并注册 namespace Eco.Web.App.Models { public class MyExceptionAttribute : HandleErro ...
- 转:Task任务调度实现生产者消费者模式
我们经常会遇到生产者消费者模式,比如前端各种UI操作事件触发后台逻辑等.在这种典型的应用场景中,我们可能会有4个业务处理逻辑(下文以P代表生产者,C代表消费者): 1. FIFO(先进先出) ...
- .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...
- 使用BlockingQueue的生产者消费者模式
BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.使用场景. 首先它是一个队列,而一个队 ...
- Java设计模式—生产者消费者模式(阻塞队列实现)
生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...
随机推荐
- Java多态中的注意事项
1.“覆盖”私有方法 public class PrivateOverride { private void f() { print("private f()"); } publi ...
- Oracle 10g DataGuard手记之基础配置
DataGuard为企业数据的高可用性,数据安全以及灾难恢复提供支持,一般由一个primary db与几个物理或逻辑standby db组成一个DataGuard配置. 系统环境 操作系统为windo ...
- create a C# context menu from code
I try the one of your approach, it works well in my computer. Below is my code: public void AddConte ...
- 关于.jar的文件在cmd中无法连接数据库的问题
我使用一个.jar的文件,想在cmd中以“java -jar *.jar”的格式运行,方便system.println()一些信息,该jar包中包含数据库连接内容,在我关闭comodo防火墙和wind ...
- jquery 日期控件
控件官网: http://www.interidea.org/demo/icalendar.php#demohtml绑定控件 $("#startdate").icalendar({ ...
- 一些常被你忽略的CSS小知识
1.CSS的color属性并非只能用于文本显示 对于CSS的color属性,相信所有Web开发人员都使用过.如果你并不是一个特别有经 验的程序员,我相信你未必知道color属性除了能用在文本显示,还可 ...
- 教程-Supports判断接口(Instance)是否支持
function TCommandEnabledController.GetCommandVisible(const ACommandName: string): Boolean; var I: In ...
- pcb原理图注意问题大汇总
1. 元器件之间连线用Wire(■)命令而不是用Line( /)命令,虽然从表面上看,两者都是直线,只是颜色稍有些不同,但用Wire(■)命令放置的导线是具有电气特性的,而用Line(/)命令放置的直 ...
- 转载Expression Tree揭秘
概述 在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞,如LINQ to NHiber ...
- 基于XML数据库的学生信息管理系统的设计与实现
本项目是在学习之余写的,主要用来练习MVC+DAO的分层设计思想,项目基于一个简单的XML学生数据库,使用XML作为数据库的原因是其十分的小巧与方便,使用dom4j即可进行方便的解析.因为这段时间课程 ...