- 浏览: 741284 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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:
string2020 写道git clone --bare表示 ...
复制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 854做Java开发,对于ClassLoader的机制是必须要熟悉 ... -
JVM Internals
2014-12-05 11:04 791This article explains the ... -
JVM必备指南
2014-11-01 11:20 484本文由 ImportNew - xiafei 翻译自 ant ... -
open jdk源码下载地址
2014-10-13 23:19 1130OpenJDK 和Oracle JDK 共用了大量相同的代码 ... -
Java中System.loadLibrary() 的执行过程
2014-10-10 11:45 6182转自:http://my.oschina.net/wolfc ... -
java 垃圾回收总结
2014-10-03 22:47 720转自:http://www.cnblogs.com/aigo ... -
java中volatile关键字的含义
2014-10-03 22:39 639转自:http://www.cnblogs.com/aigo ... -
java并发编程-Executor框架
2014-10-01 23:40 566Executor框架是指java 5中 ... -
Java中ArrayList和LinkedList区别
2014-09-17 18:48 579转自:http://pengcqu.iteye. ... -
深入理解Java内存模型之系列篇
2014-09-16 11:16 870转自:http://blog.csdn.net/ ... -
Java Thread 总结
2014-09-15 22:39 599转自:http://www.cnblogs.com/Drea ... -
如何停止一个正在运行的java线程
2014-09-15 22:33 1991转自:http://ibruce.info/2013/12 ... -
详解sleep和wait的区别
2014-09-15 22:16 2473转自:http://www.cnblogs.com/Dre ... -
Java多线程总结之由synchronized说开去
2014-09-14 13:11 661转自: http://hellosure.iteye.co ... -
ThreadLocal的正确用法
2014-09-13 23:52 506用法一:在关联数据类中创建private static ... -
Hashtable与ConcurrentHashMap差别
2014-09-06 00:00 923Hashtable与ConcurrentHashMap区别 ... -
JAVA多线程和并发基础面试问答
2014-09-01 22:56 685多线程和并发问题是Jav ... -
java 双重加锁及单例模式
2014-08-25 18:02 1164单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使 ... -
Java内部类的使用小结
2014-08-13 21:45 574内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹 ... -
java sleep和wait的区别和联系
2014-08-10 20:46 667第一种解释: 功 ...
相关推荐
这就是一个基本的Java“生产者-消费者”模型实现。通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化...
在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...
总的来说,Java生产者消费者问题是一个重要的多线程编程概念,它展示了如何通过同步和通信机制在并发环境中有效地管理资源。通过学习和实践这个模型,开发者可以提升在并发编程中的技能,更好地设计和优化多线程应用...
Java生产者消费者问题是多线程编程中的一个经典案例,它主要展示了如何通过共享资源来实现线程间的协作。这个问题源于现实生活中的生产流水线,其中生产者负责制造产品,而消费者负责消耗这些产品。在计算机系统中,...
Java生产者消费者模式是一种多线程设计模式,它在并发编程中被广泛使用,用于解决资源的共享问题。...了解并熟练掌握生产者消费者模式是每个Java开发人员必备的技能之一,它能够帮助我们编写出高效、稳定的并发程序。
Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...
在Java编程中,"生产者消费者问题"是一个经典的多线程同步问题,它涉及到了如何在多线程环境下有效地共享资源。在这个问题中,"生产者"负责创建资源,而"消费者"则负责消费这些资源。为了确保生产者不会在资源耗尽时...
总之,生产者消费者模式和中介者设计模式的结合是解决并发问题的一种有效方式,它可以帮助我们构建更加灵活、可维护的系统。通过阅读你提供的`consumption`代码,我们可以深入理解这些概念在实际项目中的应用。
在计算机科学中,生产者-消费者问题是多线程并发控制中的一个经典问题。该问题描述了两个并发执行的进程——生产者和消费者,它们共享一个有限大小的缓冲区。生产者进程负责生成数据(消息)并放入缓冲区,而消费者...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
在Java编程中,"生产者消费者"模式是一种典型的多线程问题解决模型,它通过共享资源来协调生产者和消费者之间的操作。这个模式的核心在于如何有效地管理资源的生产和消费,以避免生产过快导致资源浪费,或者消费者...
Java 生产者消费者演示程序 在这个示例程序中,我们可以看到的是生产者消费者模型的实现。该模型描述了一个生产者和一个消费者之间的关系,生产者生产产品,并将其存储在缓冲区中,而消费者则从缓冲区中消费产品。 ...
在Java中实现生产者消费者模式,主要依赖于Java提供的并发工具类,如`BlockingQueue`接口以及其实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。这些队列具有线程安全的特性,能够有效地避免数据竞争和...
Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...
通过本次实验,不仅加深了对Java并发编程的理解,还掌握了如何在多线程环境下实现生产者与消费者模型,确保数据的线程安全和一致性。实验过程中,使用Eclipse IDE搭建开发环境,通过编写和调试代码,成功实现了三个...
Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...
在Java编程中,"生产者与消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的核心思想是通过共享一个有限的缓冲区,使得生产者线程可以将产品放入缓冲区,而消费者线程则可以从缓冲区取出...
在Java编程中,死锁和生产者消费者问题是多线程编程中的两个重要概念,它们涉及到并发执行和资源管理。理解并正确处理这些问题对于构建高效、可靠的多线程应用至关重要。 死锁是指两个或多个线程在执行过程中,因...
在Java编程中,"生产者-消费者"模型是一种常见的多线程问题,它涉及到进程...通过图形用户界面,用户可以直观地看到生产者和消费者如何在有限的资源下协同工作,这对于理解和学习并发编程和多线程同步概念非常有帮助。