- 浏览: 121934 次
- 性别:
- 来自: 抽象空间
最新评论
-
Dancen:
理想状态下jar包的更新当然不应该去修改其中的方法签名等外部依 ...
javamake.jar & javamake-ant15.jar -
mwei:
Dancen 写道javamake可以解决代码之间的依赖问题, ...
javamake.jar & javamake-ant15.jar -
Dancen:
javamake可以解决代码之间的依赖问题,但如果调用的是外部 ...
javamake.jar & javamake-ant15.jar -
kidding87:
看到了楼主的connet by用法,又看到这个很久以前的东西, ...
海螺式初始化二维数组 -
pxlfxl2:
mwei 写道pxlfxl2 写道如果我的需求是要打印A到Z ...
三线程顺序打印N次ABC
关于Object.wait()和Object.notify()/notifyAll()的使用,再写个练习。
生产者-消费者问题:有一个公共的资源池Source,生产者生产物品放到资源池中,消费者从资源池拿物品消费掉。
当资源池没有资源(物品)的时候,通知生产者生产物品放到资源池里;
当任何一个生产者生产完成之后,通知消费者们来消费物品;
消费者们会把所有资源消费掉,然后通知生产者生产物品;
啰嗦这么多,就是生产的时候只能有一个生产者,不能两个(多个)生产者连续生产;消费的时候可以有多个消费者连续消费。
就用这样的需求练习练习吧。
假设资源池Source是个长度为30的数组int[] source=new int[30]; //值[1,2,3...,28,29,30] 数组的值=相应下标+1;
数组的值只是用于标记,标记这个位置已经放置物品了;
第一次生产了20个物品,那么放置的位置是数组的下标[0,19],相应值是[1,20];
那么下次(可能是别的生产者)放置物品的开始位置(下标)是20;
通知消费者们来消费,那么消费者消费的开始位置(下标)是0;
消费完之后,如果第二次也生产了20个物品,那么放置的位置是数组的下标[20,9],相应值是[21,22..29,30,1,2...9,10];
那么下次(可能是别的生产者)放置物品的开始位置(下标)是10;通知消费者们来消费,那么消费者消费的开始位置(下标)是20;
此时把资源池想象成为一个可旋转的大圆桌,在圆桌的边缘放置了30个碟子,编号就是0到29;
通过向固定的方向旋转圆桌来有秩序的生产和消费^..^
还请JE上的朋友给点建议。
资源池类:
生产者类:
消费者类
测试:
运行结果的一部分:
生产者-消费者问题:有一个公共的资源池Source,生产者生产物品放到资源池中,消费者从资源池拿物品消费掉。
当资源池没有资源(物品)的时候,通知生产者生产物品放到资源池里;
当任何一个生产者生产完成之后,通知消费者们来消费物品;
消费者们会把所有资源消费掉,然后通知生产者生产物品;
啰嗦这么多,就是生产的时候只能有一个生产者,不能两个(多个)生产者连续生产;消费的时候可以有多个消费者连续消费。
就用这样的需求练习练习吧。
假设资源池Source是个长度为30的数组int[] source=new int[30]; //值[1,2,3...,28,29,30] 数组的值=相应下标+1;
数组的值只是用于标记,标记这个位置已经放置物品了;
第一次生产了20个物品,那么放置的位置是数组的下标[0,19],相应值是[1,20];
那么下次(可能是别的生产者)放置物品的开始位置(下标)是20;
通知消费者们来消费,那么消费者消费的开始位置(下标)是0;
消费完之后,如果第二次也生产了20个物品,那么放置的位置是数组的下标[20,9],相应值是[21,22..29,30,1,2...9,10];
那么下次(可能是别的生产者)放置物品的开始位置(下标)是10;通知消费者们来消费,那么消费者消费的开始位置(下标)是20;
此时把资源池想象成为一个可旋转的大圆桌,在圆桌的边缘放置了30个碟子,编号就是0到29;
通过向固定的方向旋转圆桌来有秩序的生产和消费^..^
还请JE上的朋友给点建议。
资源池类:
/** * 资源池 * @author mwei * @version 1.0 */ public class Source { public static final int CAPACITY=30; public static int[] source=new int[CAPACITY]; //值[1,2,3...,28,29,30] public static int in=0; //the position to set source public static int out=0; //the position to get source public static final byte[] LOCK=new byte[0]; }
生产者类:
import java.util.Random; public class Producer implements Runnable{ public static Random random=new Random(); public static volatile boolean prun=true; //信号量 private String name; public Producer(String name){this.name=name;} public String getName(){return name;} public void run(){produce();} public void produce(){ while (true) { synchronized (Source.LOCK) { if (prun) { Source.LOCK.notifyAll(); int planNum = random.nextInt(10) + 15; // 计划生产资源的数量,最少15个,最多24个 int actualNum = 0; for (int i = Source.out; i < Source.CAPACITY + Source.out; i++) { // 查找放置资源的位置 int index = i % Source.CAPACITY; if (Source.source[index] == 0) { Source.in = index; // 找到 break; } } for (int i = 0; i < planNum; i++) { // 放置资源 if (Source.source[Source.in] == 0) { actualNum++; // 统计实际放置资源的个数 Source.source[Source.in] = Source.in + 1; Source.in = (++Source.in % Source.CAPACITY); } } int total = 0; for (int i = 0; i < Source.CAPACITY; i++) { // 统计资源池中总共的资源个数 if (Source.source[i] != 0) total++; } System.out.print(this.getName() + "Plan : " + planNum + "\t Produce : " + actualNum); // 输出计划量和实际生产量 System.out.println("\tTotal : " + total + "\tRange : [" + Source.out + "," + (Source.in + Source.CAPACITY - 1) % Source.CAPACITY + "]"); // 资源总值及范围 prun = false; // 生产者只生产一次 Consumer.crun = true; } else { try { System.out.println(this.getName() + ".wait();"); Source.LOCK.wait(); } catch (InterruptedException ie) { ie.printStackTrace(); } } } // end syn } // end while } }
消费者类
public class Consumer implements Runnable{ public static final int CONSUME_NUM=4; public static volatile boolean crun=false; //信号量 private String name; public Consumer(String name){ this.name=name; } public String getName(){ return name; } public void run(){ consume(); } public void consume(){ while (true) { synchronized (Source.LOCK) { if (crun) { Source.LOCK.notifyAll(); int actualNum = 0; for (int i = 0; i < CONSUME_NUM; i++) { if (Source.source[Source.out] != 0) { actualNum++; Source.source[Source.out] = 0; // 消耗掉 Source.out = (Source.out + 1) % Source.CAPACITY; } else { ; // do nothing } } System.out.println(this.getName() + " : consumes " + actualNum); int total = 0; for (int i = 0; i < Source.CAPACITY; i++) { // 统计资源池中总共的资源个数 if (Source.source[i] != 0) total++; } if (total == 0) { // 消费者把资源消费光了再通知生产者 crun = false; Producer.prun = true; } } else { try { System.out.println(this.getName() + ".wait();"); Source.LOCK.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } // end syn } // end while } }
测试:
/** * test 3 producers and 4 consumers * @author mwei */ public class Test { public static void main(String[] args) { new Thread(new Producer("P1=>")).start(); new Thread(new Producer("P2=>")).start(); new Thread(new Producer("P3=>")).start(); new Thread(new Consumer("C1=>")).start(); new Thread(new Consumer("C2=>")).start(); new Thread(new Consumer("C3=>")).start(); new Thread(new Consumer("C4=>")).start(); } }
运行结果的一部分:
P3=>Plan : 18 Produce : 18 Total : 18 Range : [28,15] C2=> : consumes 4 C3=> : consumes 4 C1=> : consumes 4 C4=> : consumes 4 P3=>.wait(); C2=> : consumes 2 P2=>Plan : 19 Produce : 19 Total : 19 Range : [16,4] C3=> : consumes 4 C1=> : consumes 4 C4=> : consumes 4 C2=> : consumes 4 P2=>.wait(); C3=> : consumes 3 C1=>.wait(); C4=>.wait(); C2=>.wait(); C3=>.wait(); P3=>Plan : 18 Produce : 18 Total : 18 Range : [5,22] P1=>.wait(); P2=>.wait(); C3=> : consumes 4 C1=> : consumes 4 P3=>.wait(); C4=> : consumes 4 C2=> : consumes 4 C3=> : consumes 2 C1=>.wait(); C4=>.wait(); C2=>.wait(); C3=>.wait(); P2=>Plan : 18 Produce : 18 Total : 18 Range : [23,10] P1=>.wait(); P3=>.wait(); P2=>.wait(); C1=> : consumes 4 C4=> : consumes 4 C3=> : consumes 4 C2=> : consumes 4 C1=> : consumes 2 C4=>.wait(); C3=>.wait(); C2=>.wait();
发表评论
-
泛型<T>的转换问题
2011-04-28 15:03 2在问答里提问,没有得到答案,特开此贴讨论。 代码如下: ... -
fibonacci的几种实现及尾递归
2011-03-27 22:55 3781/** * java version "1. ... -
将一个自然数拆分为若干不重复自然数之和(OO实现)
2011-03-13 22:04 2071原题出处:http://www.iteye ... -
自然数m的立方可写成m个连续奇数之和
2010-10-22 09:49 4424题目: 任何一个自然数m的立方均可写成m个连续奇数之和。 例如 ... -
使用内部类实现多重继承
2010-09-07 19:10 1107最常见的实现多重继承的方式,是implements inter ... -
怎么捕获webwork下载文件时的异常
2010-08-09 17:02 1009使用webwork的文件下载方式,action配置如下: ... -
java.rmi.UnmarshalException: invalid method hash
2010-07-30 16:25 4078今天在应用程序中报了下面异常: java.rmi.Serv ... -
转:java 获取ftp文件大小
2010-07-30 11:46 9792【注】:本代码摘自 http://www.java2s.com ... -
判断字符串是否是数字
2010-03-13 14:47 1044看到一笔试题,如题; 《c程序设计语言》第二版5.2节里有ge ... -
三线程顺序打印N次ABC
2010-02-27 15:17 3027记得前一阵子JE上讨论线程顺序打印的面试题,现在有空也练练。 ... -
求数组的平衡点
2010-02-27 14:47 2042原文见:http://www.iteye.com/topic/ ... -
怎么记忆Thread.join()
2010-02-23 16:57 2549Thread.join() JDK_API:等待该线程终止。 ... -
海螺式初始化二维数组
2009-12-13 22:33 1397原题见:http://www.iteye.com/topic/ ... -
初涉java多线程(二)
2009-12-04 23:10 945原文:http://huagenli.iteye.com/bl ... -
Collection’modifiers seem not correct when reflect
2009-12-03 22:48 993做练习的时候就抄了如下方法 public static v ... -
对private static 实例变量同步,线程获得的是什么锁?
2009-11-29 11:01 1143初学线程,还是比较愚的。 问题如题,就是在方法中加了synch ... -
初涉java多线程(一)
2009-11-23 22:14 906十一期间看了一点java多 ... -
new StringBuilder() VS new StringBuilder(arg)
2009-09-30 17:35 1300StringBuilder,非线程安全 ... -
一种截取字母汉字混合串的方法(String.getBytes)
2009-08-09 21:37 2098/** * 按字节截取字符串 * @para ... -
一种截取字母汉字混合串的方法(String.split)
2009-08-08 23:28 1628/** * 按字节截取字符串 * @ ...
相关推荐
主线程、生产者线程(一)、消费者管理线程(一)、消费者线程(多),以及一些全局变量。 主线程职责:UI控件的控制和显示、控制生产者:调节生产的速度和暂停与继续、控制消费 生产者线程职责:根据商品数量调控...
当生产者向缓冲区放入了一个数据,应唤醒正在等待的消费者进程,同样,当消费者取走一个数据后,应唤醒正在等待的生产者进程。就是生产者和消费者之间的同步。 每次写入和读出数据时,都将读和写指针加一。当读写...
Qt入门练习项目——生产者消费者模型 Qt入门练习项目源码,通过本项目从而了解Qt,进行一个简单的入门。 本文件是对应项目源码,希望多多交流。
C#编写的有关操作系统中生产者与消费者问题的实例,画面美观,生动形象的描绘了生产者与消费者之间的关系,代码部分简介易懂。
# 实践并发和分布式系统============================================== 格拉纳达大学并发和分布式系统实践的一套程序。... 生产者-消费者练习实践3: 生产者-消费者运动 (mpi) 哲学家练习哲学家侍者练习
Visual studio 2008做的生产者消费者操作系统练习
操作系统生产者和消费者问题操作系统生产者和消费者问题操作系统生产者和消费者问题操作系统生产者和消费者问题操作系统生产者和消费者问题
机械工业出版社 并行程序设计导论 第五章练习题5.6自己写来练手的。
java多线程练习demo 基本的线程使用方式 生产者消费者练习 龟兔赛跑练习
进程的同步与互斥习题(含部分题目的参考答案).doc
同步锁 线程 生产者消费者问题 适合新手的线程练习
Java 生产消费者模式练习demo,供初学者入门。资深工程师请绕路。
ConsumerAndProduction:生产者消费者模式的几种Java实现 NiuKe: 牛客网一些题目练习 offer: 2016年4月以来,参加在线笔试的一些公司的编程题目 pattern: 设计模式练习 Practice: 一些无目的的代码练习 base: ...
练习11:线程和生产者-消费者问题 一家餐厅有n名厨师和m名女服务员。 厨师们会尽可能地做饭,并将完成的菜放入孵化场。 服务员站在舱口前等待。 每当准备好饭菜时,服务员就会拿起饭并将其带给客人。 孵化场可以容纳...
实现生产者消费者模型 实现一个线程安全的队列 实现一个无锁队列 实现一个线程池 Go 连接数据库 Go Web 开发 Web 框架 Gin 框架 Beego 框架 Go 可视化库 Echarts C++ 攻略 STL vector list stack queue deque ...
注释: 请确保您的 MessageBrokerImpl 是线程安全的,因为多个生产者和消费者可以同时使用代理字数不应该区分大小写###Part II – 日志记录 您的团队领导要求您使用通用日志记录框架(例如 log4j)向应用程序添加...
985工程大学的java课程练习题,平时作业题目,还有一些综合性较强的练习,如,21点游戏,多生产者多消费者,等等
消费者生产者Java PRO练习
该练习的目的是模拟生产者/消费者的情况。 Producer在随机时间(最小和最大持续时间之间的分钟)内创建任务,并将其放入Queue 。 Consumer处理此Queue的任务。 处理时间是随机的。 您可以将.NET类Queue与方法Enqueue...