- 浏览: 717463 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (439)
- 生活小感 (9)
- Java (65)
- 笔面经 (18)
- 算法 (45)
- 读书笔记 (1)
- Android (147)
- 设计模式 (7)
- C语言 (7)
- 职业生涯 (6)
- 网络 (5)
- 数据库 (3)
- Linux/Unix (21)
- C++ (7)
- 思考 (3)
- WinPhone (4)
- Git (6)
- http (1)
- UML (1)
- SQL (2)
- Ant (1)
- iOS (14)
- FFmpeg (22)
- WebRTC (10)
- Mac (2)
- web (0)
- TCP (2)
- Vim (2)
- OpenSSL (1)
- OpenGL (6)
- 多媒体 (10)
- cocos2d (2)
- svn (1)
最新评论
-
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
WebSocket初探【转】 -
ding335306:
这个目录下没有找到此文件
eclipse.ini in MAC -
songshuaiyang:
哥们写东西可真乱啊
Android获取cpu和内存信息、网址的代码 -
zhoutao_temp:
这是自己能看懂还是让别人能看得懂,您就不能把版面稍微整理一下吗 ...
FFMPEG源码分析 -
chriszeng87:
<div class="quote_title ...
复制git库
这个例子有点局限,消费者每次只能等生产者生产了n个Q后消费完这n个。
package com.test; class Q { int n; boolean valueSet = false; //Q的value是不是已经设置过了 synchronized int get() { if(!valueSet) try { wait(); //wait until Producer produce a product and notify ,释放锁 } catch(InterruptedException e) { System.out.println("InterruptedException caught"); } System.out.println("Got: " + n); valueSet = false; notify(); return n; } synchronized void put(int n) { if(valueSet) try { wait(); } catch(InterruptedException e) { System.out.println("InterruptedException caught"); } this.n = n; valueSet = true; System.out.println("Put: " + n); notify(); } } class Producer implements Runnable { Q q; Producer(Q q) { this.q = q; new Thread(this, "Producer").start(); } public void run() { int i = 0; while(true) { q.put(i++); } } } class Consumer implements Runnable { Q q; Consumer(Q q) { this.q = q; new Thread(this, "Consumer").start(); } public void run() { while(true) { q.get(); } } } class PCFixed { public static void main(String args[]) { Q q = new Q(); new Consumer(q); new Producer(q); System.out.println("Press Control-C to stop."); } }
下面的方法转自《程序员面试攻略》第二版,机械工业出版社,P118-P119,应该是正确的解答:
生产者:
public class Producer extends Thread { private IntBuffer buffer; public Producer(IntBuffer buffer) { this.buffer = buffer; } public void run() { Random r = new Random(); while(true) { int num = r.nextInt(); buffer.add(num); System.out.println("Produced " + num); } } }
消费者:
public class Consumer extends Thread { private IntBuffer buffer; public Consumer(IntBuffer buffer) { this.buffer = buffer; } public void run() { while(true) { int num = buffer.remove(); System.out.println("Consumed " + num); } } }
缓冲区:
public class IntBuffer { private int index; private int[] buffer = new int[8]; public synchronized void add( int num ) { while(index == buffer.length-1) { try { wait(); }catch(InterruptedException e) { } } buffer[index++] = num; notifyAll(); } public synchronized int remove() { while(index == 0) { try { wait(); }catch(InterruptedException e) { } } int ret = buffer[--index]; notifyAll(); return ret; } }
这段代码允许多个生产者和多个消费者使用同一个缓冲区,解决了第一个方法的缺陷。
发表评论
-
Java Classloader机制解析
2015-07-14 14:14 801做Java开发,对于ClassLoader的机制是必须要熟悉 ... -
JVM Internals
2014-12-05 11:04 744This article explains the ... -
JVM必备指南
2014-11-01 11:20 447本文由 ImportNew - xiafei 翻译自 ant ... -
open jdk源码下载地址
2014-10-13 23:19 1083OpenJDK 和Oracle JDK 共用了大量相同的代码 ... -
Java中System.loadLibrary() 的执行过程
2014-10-10 11:45 6060转自:http://my.oschina.net/wolfc ... -
java 垃圾回收总结
2014-10-03 22:47 676转自:http://www.cnblogs.com/aigo ... -
java中volatile关键字的含义
2014-10-03 22:39 592转自:http://www.cnblogs.com/aigo ... -
java并发编程-Executor框架
2014-10-01 23:40 534Executor框架是指java 5中 ... -
Java中ArrayList和LinkedList区别
2014-09-17 18:48 531转自:http://pengcqu.iteye. ... -
深入理解Java内存模型之系列篇
2014-09-16 11:16 818转自:http://blog.csdn.net/ ... -
Java Thread 总结
2014-09-15 22:39 560转自:http://www.cnblogs.com/Drea ... -
如何停止一个正在运行的java线程
2014-09-15 22:33 1946转自:http://ibruce.info/2013/12 ... -
详解sleep和wait的区别
2014-09-15 22:16 2430转自:http://www.cnblogs.com/Dre ... -
Java多线程总结之由synchronized说开去
2014-09-14 13:11 617转自: http://hellosure.iteye.co ... -
ThreadLocal的正确用法
2014-09-13 23:52 462用法一:在关联数据类中创建private static ... -
Hashtable与ConcurrentHashMap差别
2014-09-06 00:00 872Hashtable与ConcurrentHashMap区别 ... -
JAVA多线程和并发基础面试问答
2014-09-01 22:56 636多线程和并发问题是Jav ... -
java 双重加锁及单例模式
2014-08-25 18:02 1125单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使 ... -
Java内部类的使用小结
2014-08-13 21:45 535内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹 ... -
java sleep和wait的区别和联系
2014-08-10 20:46 620第一种解释: 功 ...
相关推荐
学习Java线程之并发协作生产者消费者模型.pdf
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
多线程并发 生产者 消费者 java 简单实用
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制. 说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数. 设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后...
在多道程序环境下,进程同步问题十分重要,通过解决“生产者-消费者”问题,可以帮助我们更好的理解进程同步的概念及实现方法。掌握线程创建和终止的方法,加深对线程和进程概念的理解,会用同步与互斥方法实现线程...
(1)设置存放产品的缓冲区的个数为6个。 (2)信号量机制实现生产者和消费者对缓冲区的互斥访问。 (3)生产者生产产品时,要输出当前缓冲区冲产品的个数和...(5)用多线程的并发实现生产者进程和消费者进程的同步。
os课程设计、通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制
5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...
本课程设计的目的是通过设计一个消费者进程与生产者进程的同步模拟系统,认识进程间的同步机制生产者消费者问题是一个著名的进程同步问题。 (1) 有一群生产者进程在生产消息, 并将消息提供给消费者进程去消费。为...
生产者消费者synchronized实现方式
主要介绍了java并发学习之BlockingQueue实现生产者消费者详解,具有一定参考价值,需要的朋友可以了解下。
而本程序正是基于这种思想设计出来的,用来模拟生产者消费者问题的解决过程。 本程序在运行时提供友好的交互界面,且操作简单,在模拟过程中各种情况有相应文字提示,并伴有相应的图像变化,如:当没有产品可消费的...
5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 Synchronizer 5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 Executor 框架 6.3 ...
本程序在界面上使用了Java的swing接口函数,用矩形条表示生产者进程中待生产的产品,并设置了三个分区分别表示生产者进程待生产的产品、公共缓冲池中已生产的产品和消费者进程已消费的产品,以动画的效果动态演示了...
第30节通过生产者消费者模型理解等待唤醒机制00:20:50分钟 | 第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition...
5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...
通过生产者消费者模型理解等待唤醒机制.mp4 Condition的使用及原理解析.mp4 使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与...
代码里面包含一个并发4个线程同时运行 全部开始 全部停止 单个停止还有点问题。 还有生产者消费者 里面的里面能帮助你理解多线程的运用!
主要介绍了Java多线程并发生产者消费者设计模式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下