生产者消费者的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)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
随机推荐
- J2EE进阶(十八)基于留言板分析SSH工作流程
J2EE进阶(十八)基于留言板分析SSH工作流程 留言板采用SSH(Struts1.2 + Spring3.0 + Hibernate3.0)架构. 工作流程(以用户登录为例): 首先是用 ...
- 在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会
在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会.骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天.要求尽早聚会 ...
- 1.Cocos2dx 3.2中vector,ValueMap,Touch触摸时间的使用.iconv字符编解码
Cocos2dx3.2以后使用Vector<T>代替了CCArray.案例如下: 头文件:T02Vector.h #ifndef __T02Vector_H__ #define __ ...
- Dynamics CRM 非声明验证方式下连接组织服务的两种方式的性能测试
今天看了勇哥的博文"http://luoyong0201.blog.163.com/blog/static/1129305201510153391392/",又认识到了一种新的连接 ...
- Android时遇到R.java was modified manually! Reverting to generated version!
欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 进入 eclipse后clipse Menu >Projects > clean 这么做就把R文件删了,但是别担心, ...
- 【Android应用开发】Android 蓝牙低功耗 (BLE) ( 第一篇 . 概述 . 蓝牙低功耗文档 翻译)
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50515359 参考 : -- 官方文档 : https://develope ...
- memcached实战系列(一)memcached安装
下载并安装Memcached服务器端 我用的是cenos6.5 64位系统. libevent是个程序库,它将Linux的epoll.BSD类操作系统的kqueue等事件处理功能封装成统一的接口,具有 ...
- Android多点触摸缩放图片-android学习之旅(四)
获取多触摸点 核心代码: 获取触摸点的个数和位置 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction ...
- 2、MyEclipse和Eclipse调优,MyEclipse配置(tomcat和jdk的内存设置),jar引入相关知识点,将Java项目编程web项目的办法
1.WindowàPreferenceàGeneralàWorkspaceàText file encoding都改成UTF-8 2.WindowàPreferenceàGeneralàEdito ...
- JSP自定义标签必知必会
自定义标签技术自sun公司发布以来,便一向很受欢迎!下面我就来谈一谈如何实现自定义标签,以及如何使用自定义标签. 如何实现自定义标签 首先我们应该知道原理,不管是标签还是JSP,本身实际上都会被JSP ...