- 浏览: 1783227 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (528)
- java基础 (35)
- oracle (23)
- 项目管理 (10)
- 代码架构 (27)
- java线程与进程 (2)
- 盈利模式 (10)
- 性能测试 (1)
- Ophone (2)
- web (6)
- asp (0)
- php (1)
- c# (1)
- Ruby (0)
- jboss (4)
- java基础之面试篇 (7)
- 数据查询优化 (1)
- weblogic (3)
- EJB (1)
- EXT (6)
- jquery (8)
- struts2 (2)
- struts1 (1)
- css (1)
- javascript (4)
- SSI (9)
- linux (9)
- c++ (6)
- 网络安全 (3)
- swing (2)
- 嵌入式 (1)
- 图像处理(机器人智能技术) (1)
- vb (2)
- mysql (2)
- sqlserver (10)
- dephi (0)
- Android (4)
- hadoop (1)
- maven (4)
- mybatis (1)
- html5 (1)
- 算法 (0)
- 高并发架构总结 (1)
- 时事评论 (4)
- 有些话不能不说 (35)
- 琴棋书画 (0)
- 教育 (1)
- 创业需要的 (4)
- 产品经理需要的 (4)
- 小南那些青涩的文章 (9)
- 如何创新 (4)
- 历史借鉴之秦汉 (1)
- 历史借鉴之三国 (1)
- 历史借鉴之魏晋 (1)
- 历史借鉴之隋唐 (1)
- 历史借鉴之南北宋 (1)
- 历史借鉴之近现代史 (1)
- 好工具我来推荐 (4)
- 汇编 (14)
最新评论
-
bilimeng:
求教,ConcurrentHashMap不是线程安全的么,为啥 ...
架构师之jdk8-----------------ConcurrentHashMap快速构建本地缓存和单例模式 -
baiducctv5:
wtaisi 写道wtaisi 写道|||||||||
spring aop中的propagation的7种配置的意思 -
zhangdong92:
另外内存泄漏一般也不是指计算时溢出。而是指某些对象已经不再使用 ...
java基础之面试篇三---int,float,long,double取值范围,内存泄露 -
zhangdong92:
Long.MAX_VALUE应该是(2^63)-1,而不是64 ...
java基础之面试篇三---int,float,long,double取值范围,内存泄露 -
nannan408:
java-lxm 写道好湿好湿好湿谢谢: )。
游南巅之晚秋
自Java5以来提供的BlockingQueue是一种特殊的队列, 它 是支持两个附加操作的 Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用。
以JDK中的例子略加改写如下
1 import java.util.concurrent.ArrayBlockingQueue;
2 import java.util.concurrent.BlockingQueue;
3
4 class Producer implements Runnable {
5 private final BlockingQueue queue;
6
7 Producer(BlockingQueue q) {
8 queue = q;
9 }
10
11 public void run() {
12 try {
13 while (true) {
14 queue.put(produce());
15 }
16 } catch (InterruptedException ex) {
17 System.out.println("produce interrupted " + ex.getMessage());
18 Thread.currentThread().interrupt();
19 //return;
20 }
21 }
22
23 Object produce() {
24 System.out.println("produce laugh");
25 return "haha";
26 }
27 }
28
29 class Consumer implements Runnable {
30 private final BlockingQueue queue;
31
32 Consumer(BlockingQueue q) {
33 queue = q;
34 }
35
36 public void run() {
37 try {
38 while (true) {
39 consume(queue.take());
40 }
41 } catch (InterruptedException ex) {
42 System.out.println("consume interrupted " + ex.getMessage());
43 Thread.currentThread().interrupt();
44 }
45 }
46
47 void consume(Object x) {
48 System.out.println("consume laugh "+ x);
49 }
50 }
51
52 public class BlockingQueueTest {
53 public static void main(String args[]) {
54 BlockingQueue q = new ArrayBlockingQueue(10);
55 Producer p = new Producer(q);
56 Consumer c1 = new Consumer(q);
57 Consumer c2 = new Consumer(q);
58 Thread pTh = new Thread(p);
59 pTh.start();
60 Thread cTh1 = new Thread(c1);
61 cTh1.start();
62 Thread cTh2 = new Thread(c2);
63 cTh2.start();
64 try {
65 Thread.sleep(3000);
66 }catch (Exception e) {
67 // TODO: handle exception
68 }
69 pTh.interrupt();
70 cTh1.interrupt();
71 cTh2.interrupt();
72 }
73 }
74
以JDK中的例子略加改写如下
1 import java.util.concurrent.ArrayBlockingQueue;
2 import java.util.concurrent.BlockingQueue;
3
4 class Producer implements Runnable {
5 private final BlockingQueue queue;
6
7 Producer(BlockingQueue q) {
8 queue = q;
9 }
10
11 public void run() {
12 try {
13 while (true) {
14 queue.put(produce());
15 }
16 } catch (InterruptedException ex) {
17 System.out.println("produce interrupted " + ex.getMessage());
18 Thread.currentThread().interrupt();
19 //return;
20 }
21 }
22
23 Object produce() {
24 System.out.println("produce laugh");
25 return "haha";
26 }
27 }
28
29 class Consumer implements Runnable {
30 private final BlockingQueue queue;
31
32 Consumer(BlockingQueue q) {
33 queue = q;
34 }
35
36 public void run() {
37 try {
38 while (true) {
39 consume(queue.take());
40 }
41 } catch (InterruptedException ex) {
42 System.out.println("consume interrupted " + ex.getMessage());
43 Thread.currentThread().interrupt();
44 }
45 }
46
47 void consume(Object x) {
48 System.out.println("consume laugh "+ x);
49 }
50 }
51
52 public class BlockingQueueTest {
53 public static void main(String args[]) {
54 BlockingQueue q = new ArrayBlockingQueue(10);
55 Producer p = new Producer(q);
56 Consumer c1 = new Consumer(q);
57 Consumer c2 = new Consumer(q);
58 Thread pTh = new Thread(p);
59 pTh.start();
60 Thread cTh1 = new Thread(c1);
61 cTh1.start();
62 Thread cTh2 = new Thread(c2);
63 cTh2.start();
64 try {
65 Thread.sleep(3000);
66 }catch (Exception e) {
67 // TODO: handle exception
68 }
69 pTh.interrupt();
70 cTh1.interrupt();
71 cTh2.interrupt();
72 }
73 }
74
发表评论
-
java 序列化和反序列化(针对字符串的例子)
2014-11-04 14:09 42651.前言. 摘自:http://blog.csdn.ne ... -
java的addall和system.arraycopy的效率对比
2014-07-11 18:22 14841.前言。 如题。 2.对比。 addall ... -
java时间转换总结
2014-07-01 09:35 28261.如题。 后续将时间问题都放本篇。 2.java时间处理 ... -
System.arraycopy把多个byte数组合并为一个byte数组,节省空间。
2014-05-22 14:34 53671.前言。 如题。 2.代码。 publi ... -
jdk5后并发线程优雅的创建方式ExecutorService+Callable比thread和runable两种方式简单和实用,可以替代后两者。
2014-01-23 16:48 23081.前言。 如题。ExecutorService可用在并 ... -
eclipse指定jvm路径,在没有配置jvm环境变量的时候可直接打开。
2014-01-10 15:37 24401.前言。 如题。 2.代码。 这个写在eclipse.i ... -
java如何最小值int变成最大值?可作为字符串排序使用
2013-11-30 00:29 22661.前言。 如题。 2.例子,可以直接运行。 p ... -
Myeclipse copy的工程无法发布的问题-Exploded location overlaps an existing deployment
2013-06-09 09:16 11381.前言。 直接copy,直接在Myeclipse下面 ... -
Comparator和Comparable在排序中的应用
2012-11-06 10:53 961Comparator可以实现数组排序,与原类没有很大耦合。 ... -
Myeclipse6.5不能启动和运行缓慢、运行错误的一些问题总结
2012-03-15 11:32 2163Myeclipse6.5对1.6支持部好,最好把ec ... -
java用Ant.jar的zip写文件解决文件名中文问题(转)
2012-01-09 13:51 2303package ejbModule.util; i ... -
为什么new FileOutPutStream和new File创建不了文件?java.io.FileNotFoundException 系统找不到指定的路径
2012-01-04 23:27 70523FileOutPutStream在c盘等一级目录 ... -
如何让页面一打开就远程自动下载文件
2012-01-03 19:52 2832在页面或者后台response,直接用文件头加你的文件,文件流 ... -
java如何打包zip等压缩文件
2012-01-03 19:35 2404直接调用jdk的类可以了。 package javai ... -
myclipse的export失败的一个问题
2011-09-25 12:48 1454在用eclipse将工程导出为jar或者可 ... -
Java如何定义三维数组
2011-09-10 20:21 12690java 定义三维数组,有很多方法,这里举两种: 1.直接定 ... -
一个Myeclipse视图跑出来,脱离窗口的问题
2011-02-13 17:16 4033也许经常使用Myeclipse的程序员会发现,视图窗口有 ... -
Map和Properties的遍历例子
2010-12-19 23:18 1299prperties的遍历有点麻烦,map的遍历有entrySe ... -
StringBuffer和Double.ValueOf一起用导致的错误
2010-12-04 16:36 2612StringBuffer虽然是同步的,然而如果不注意它的 ... -
线程wait和notify的针对每个线程,实现·随时暂停和唤醒
2010-11-25 12:55 1812多线程的利用在进行进程调度中具有重要的意义,是java的 ...
相关推荐
生产者-消费者问题是计算机科学中的一个经典问题,主要涉及多线程或多进程同步。这个问题在操作系统课程中常被用来讲解进程间的通信和同步机制。在这个场景中,我们讨论的是在Linux环境下,如何通过多进程的方式解决...
生产者-消费者问题可以关联到软件设计模式中的"生产者-消费者模式"和"阻塞队列模式"。这些模式在多线程编程中广泛应用于处理异步任务和数据流。 6. **优化策略**: - **批量生产/消费**:生产者一次性生产多个...
总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...
"生产者-消费者"模式是一种经典的并发设计模式,广泛应用于解决数据处理中的异步问题。本项目提供了一个简单的Java实现,帮助开发者理解如何在实际场景中运用这种模式。 生产者-消费者模式的核心思想是共享资源...
了解并熟练运用生产者/消费者模式以及像LinkedBlockingQueue这样的阻塞队列,对于优化多线程程序的性能和简化并发编程的复杂性至关重要。在阅读《xiongjiajia.iteye.com/blog/2325943》这篇博客文章时,你可以深入...
3. **生产者消费者模式**:文档会详细介绍如何设计生产者和消费者线程,如何通过阻塞队列进行通信。生产者通常调用`put()`将数据放入队列,消费者则调用`take()`从队列中取出数据。 4. **线程安全**:由于阻塞队列...
在Java编程中,"生产者-消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的主要目标是通过分离生产数据和消费数据的过程,提高系统的效率和灵活性。在这个模式中,"生产者"负责生成数据...
阻塞队列在生产者和消费者模式中起着关键的作用。Java中的`BlockingQueue`接口提供了几个实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`和`PriorityBlockingQueue`等,它们都实现了线程安全的队列操作。...
生产者与消费者模式是设计模式中的经典范例,它有效地展示了线程间的协作和同步。这个模式主要解决的问题是数据的生产和消费过程中的等待与协作问题。 在多线程环境下,生产者负责生成数据,而消费者则负责处理这些...
通过对生产者-消费者问题的理解和实践,可以深入掌握操作系统中的进程同步机制,这对于设计和优化多线程应用程序至关重要。在实际应用中,这种模型可以扩展到多个生产者和消费者,或者更复杂的系统架构,例如消息...
本文将深入探讨“多生产者-多消费者”模式,这是一种经典的线程同步问题,旨在优化资源的利用和提高系统的效率。在这个模式中,多个生产者线程生成数据,而多个消费者线程则负责消费这些数据。为了确保数据的一致性...
生产者-消费者模式利用阻塞队列来解耦两者,使得生产者生产完数据后无需等待消费者处理,而消费者也不需要知道数据何时产生,只需从队列中取数据。这里的阻塞队列实际上是一个有限的缓冲区,通常使用信号量(如互斥...
生产者消费者模式基于操作系统提供的信号量(Semaphore)或管程(Monitor)等机制,以解决进程间的通信和同步问题。在这个模式中,生产者进程负责生成数据并放入缓冲区,而消费者进程则负责从缓冲区取出数据进行处理...
生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...
在Android开发中,生产者-消费者模式是一种常见的多线程设计模式,用于处理并发问题,尤其是在数据处理和异步操作中。这个模式的核心思想是通过一个共享的数据缓冲区,使得生产者线程可以生成数据并放入缓冲区,而...
操作系统中的生产者-消费者问题是进程同步的经典案例,它涉及到多个并发执行的进程(在这里是生产者和消费者)如何协作共享有限资源(有界缓冲池)的问题。在这个问题中,生产者进程负责生产消息并放入缓冲池,而...
2. **阻塞队列**:在Java中,阻塞队列(如`ArrayBlockingQueue`)常用于生产者-消费者问题。当队列满时,生产者会被阻塞,直到队列有空位;当队列为空时,消费者会被阻塞,直到队列中有数据。这样可以避免资源浪费,...
【生产者/消费者模式】是一种常见的并发编程和系统设计模式,它主要解决的是在多线程环境下,如何协调生产者和消费者之间的数据处理问题。在软件开发中,生产者通常是生成数据的一方,而消费者则是处理这些数据的...
在多线程编程中,`QSemaphore`常被用来实现生产者-消费者模型,其中生产者线程生产数据,而消费者线程消费数据。这种模型对于并发处理和优化系统性能具有重要意义。 在“Qt中使用QSemaphore,单生产者—多消费者...