生产者消费者的java实现
先看最简单的,也就是缓冲区的容量为1
缓冲区容量为1
import java.util.List;
public class ProducerAndConsumer2 {
static class AddThread implements Runnable {
Plate plate;
public AddThread(Plate p) {
this.plate = p;
}
@Override
public void run() {
// TODO Auto-generated method stub
plate.put(new Object());
}
}
static class GetThread implements Runnable {
Plate plate;
public GetThread(Plate p) {
this.plate = p;
}
@Override
public void run() {
// TODO Auto-generated method stub
plate.get();
}
}
static class Plate {
private List<Object> egg = new ArrayList<Object>();
public synchronized void put(Object o) {
while (egg.size() > 0) {
try {
System.out.println(
"此时盘子里有鸡蛋 生产线程"+Thread.currentThread().getName()+"阻塞");
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
egg.add(0, o);
System.out.println("生产线程放入一个鸡蛋");
this.notifyAll();
}
public synchronized Object get() {
while (egg.size() == 0) {
try {
System.out.println(
"此时盘子里没有鸡蛋 消费线程"+Thread.currentThread().getName()+"阻塞");
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Object object = egg.get(0);
egg.clear();
System.out.println("消费线程取得一个鸡蛋");
this.notifyAll();
return object;
}
}
public static void main(String[] args) {
Plate p = new Plate();
for (int i = 0; i < 10; i++)
new Thread(new GetThread(p)).start();
for (int i = 0; i < 10; i++)
new Thread(new AddThread(p)).start();
}
}
如果盘子里可以存放多个鸡蛋就这样:
缓冲器容量大于1
import java.util.ArrayList;
import java.util.List;
public class ProducerAndConsumer {
public static void main(String[] args) {
Plate p = new Plate();
for (int i = 0; i < 10; i++)
new Thread(new GetThread(p)).start();
for (int i = 0; i < 10; i++)
new Thread(new AddThread(p)).start();
}
}
class AddThread implements Runnable {
Plate plate;
public AddThread(Plate p) {
this.plate = p;
}
@Override
public void run() {
// TODO Auto-generated method stub
plate.put(new Object());
}
}
class GetThread implements Runnable {
Plate plate;
public GetThread(Plate p) {
this.plate = p;
}
@Override
public void run() {
// TODO Auto-generated method stub
plate.get();
}
}
class Plate {
private List<Object> egg = new ArrayList<Object>(10);
//在0-9这十个空间存储鸡蛋
public synchronized void put(Object o) {
while (egg.size()==10) { //最多有是个鸡蛋
try {
System.out.println(
"此时盘子里有鸡蛋 生产线程"+Thread.currentThread().getName()+"阻塞");
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
egg.add(o);
System.out.println("生产线程放入一个鸡蛋 现有鸡蛋"+egg.size()+"个");
this.notifyAll();
}
public synchronized Object get() {
while (egg.size()==0) {
try {
System.out.println(
"此时盘子里没有鸡蛋 消费线程"+Thread.currentThread().getName()+"阻塞");
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Object object=egg.get(egg.size()-1);
egg.remove(egg.size()-1)
this.notifyAll();
System.out.println("消费线程取得一个鸡蛋 还剩余鸡蛋"+egg.size()+"个");
return object;
}
}
关于线程通信还有一个似乎是空中网的面试题
地址如下
http://blog.csdn.net/dlf123321/article/details/42751405
感谢glt
参考资料
http://blog.csdn.net/ghsau/article/details/7433673
http://blog.csdn.net/monkey_d_meng/article/details/6251879
生产者消费者的java实现的更多相关文章
- 生产者消费者问题Java三种实现
生产者-消费者Java实现 2017-07-27 1 概述 生产者消费者问题是多线程的一个经典问题,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品. 解决生产者/ ...
- 生产者消费者模式-Java实现
感知阶段 随着软件业的发展,互联网用户的日渐增多,并发这门艺术的兴起似乎是那么合情合理.每日PV十多亿的淘宝,处理并发的手段可谓是业界一流.用户访问淘宝首页的平均等待时间只有区区几秒,但是服务器所处理 ...
- 生产者消费者模型Java实现
生产者消费者模型 生产者消费者模型可以描述为: ①生产者持续生产,直到仓库放满产品,则停止生产进入等待状态:仓库不满后继续生产: ②消费者持续消费,直到仓库空,则停止消费进入等待状态:仓库不空后,继续 ...
- 生产者消费者模型java
马士兵老师的生产者消费者模型,我感觉理解了生产者消费者模型,基本懂了一半多线程. public class ProducerConsumer { public static void main(Str ...
- 生产者消费者模型-Java代码实现
什么是生产者-消费者模式 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的模式,A相当于生产者,B相 ...
- JAVA多线程之生产者 消费者模式 妈妈做面包案例
创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包 最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)
生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. Blockin ...
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
随机推荐
- 用Python递归解决阿拉伯数字转为中文财务数字格式的问题(2)--打开思路的一种方法
几天前自己写了个将阿拉伯数字转为中文财务数字的程序.用的递归,不幸的是它是树形递归. 虽然实际过程中不太可能出现金额数字大到让Python递归栈溢出,但是始终是一块心病,这玩意终究在理论上是受限制的. ...
- SpriteKit:检测当新场景显示以后
Detecting When a New Scene Is Presented Sprite Kit在SKScene类中提供2个可以重载的方法用来检测当一个场景过渡出去或过渡进来的时候. 第一个方法是 ...
- JAVA面向对象-----抽象类
1抽象类 为什么使用抽象类 1:定义Dog类 有颜色属性和叫的方法 2:定义Bird类 有颜色属性和叫的方法 3:定义其父类Animal 1:颜色的属性可以使用默认初始化值. 2:叫的方法在父类中如何 ...
- [ExtJS5学习笔记]第二十八节 sencha ext js 5.1.0发布版本正式发布 extjs doc下载地址
本文地址:http://blog.csdn.net/sushengmiyan/article/details/41911539 本文作者:sushengmiyan ------------------ ...
- 浅谈SSH框架
在学习或者接触一个新的概念的时候,我们应该在脑海中发挥我们的搜索引擎,牵一发动全身的去想,这个知识跟我之前接触过的有哪些相同或者不同的地方,从这个角度去看那些新的知识和概念,经过旧知识和新知识的对比我 ...
- linux配置java环境变量 转过几个,这个最详细和靠谱
一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录,之后会在当前目录下生成一个jdk1.6.0_14目录二. 需要配置的环境变量 1. PATH环境 ...
- 剑指Offer——携程笔试题+知识点总结
剑指Offer--携程笔试题+知识点总结 情景回顾 时间:2016.9.17 19:10-21:10 地点:山东省网络环境智能计算技术重点实验室 事件:携程笔试 总体来说,携程笔试内容与其它企业笔试题 ...
- 2.Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程
1 Lucen目录介绍 2 lucene-core-3.6.2.jar是lucene开发核心jar包 contrib 目录存放,包含一些扩展jar包 3 案例 建立第一个Lucene项目 ...
- 1.0、Android Studio管理你的项目
项目概览 Android Studio中的项目包含了开发一个app的工作环境所需要的一切.从代码,到资源,到测试到构建配置.当你创建一个新的项目的时候,Android Studio为所有的文件创建了必 ...
- 让 Google Test 出错时断点
Google Test 缺省是出错退出. 如果最后的出错行在系统库中,那就没什么帮助. 如果是调试运行,直接退出根本就不知道哪里出错了. 后来添加了一个运行参数: --gtest_break_on_f ...