生产者消费者的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)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
随机推荐
- 计算机网络之套接字SOCKET
当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口. 此接口再将控制权传递给计算机的操作系统.操作系统将此调用转给某个内部过程,并执行所请求的操作. 内部过程一旦执行完毕,控制权就又 ...
- 最大熵模型The Maximum Entropy
http://blog.csdn.net/pipisorry/article/details/52789149 最大熵模型相关的基础知识 [概率论:基本概念CDF.PDF] [信息论:熵与互信息] [ ...
- High Executions Of Statement "delete from smon_scn_time..."
In this Document Symptoms Cause Solution APPLIES TO: Oracle Database - Enterprise Edition - Ve ...
- Android6.0 init 深入分析
之前写过一篇关于android5.0 init的介绍,这篇博客是介绍android6.0init,之前有的代码介绍不详细.而且分析 解析init.rc那块代码也没有结合init.rc介绍. 一. ma ...
- [转]django-registration quickstart
Basic configuration and use--------------------------- Once installed, you can add django-registrati ...
- 24 AIDL案例
服务端 MainActivity.java package com.qf.day24_aidl_wordserver; import android.app.Activity; import andr ...
- EBS系统管理常用SQL语句整理汇总(参考网上资料&其他人博客)
--1查找系统用户基本信息 SELECT user_id, user_name, description, employeE_id, person_party_id FROM fnd_user; -- ...
- SKSpriteNode对象初始化在iPhone 6 plus中显示不正确的分析及解决
一个SpriteKit项目在其他设备上运行都无问题(无论是真机或是模拟器),但是在iPhone6 Plus上会出现精灵对象纹理被过度放大的现象: 从上图中大家可以看到无论是主角或是道具球都过大了. 看 ...
- #VSTS日志# Xamarin构建支持和一大波更新
距离上次更新#VSTS日志#已经有将近3个月的时间了,赶上最近Xamarin开源免费的消息,VSTS也推出了更多跨平台的支持和许多其他功能.这里列出一些小编觉得比较重要. 1. Xamarin 构建模 ...
- 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
反射中加载类: Java中有一个Class类用于代表某一个类的字节码 .class文件 对应Class //1 加载类 // java中Class代表一个类,但是到底代表哪个类要明确指出 ...