自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
分享到:
相关推荐
综上所述,解决生产者-消费者问题涉及操作系统核心概念,如进程同步、互斥访问和条件等待。通过理解这些知识点并结合论文和源码,可以深入学习和掌握多进程编程和同步技术。在实际项目中,这样的技能对于构建高效、...
生产者-消费者问题可以关联到软件设计模式中的"生产者-消费者模式"和"阻塞队列模式"。这些模式在多线程编程中广泛应用于处理异步任务和数据流。 6. **优化策略**: - **批量生产/消费**:生产者一次性生产多个...
总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...
了解并熟练运用生产者/消费者模式以及像LinkedBlockingQueue这样的阻塞队列,对于优化多线程程序的性能和简化并发编程的复杂性至关重要。在阅读《xiongjiajia.iteye.com/blog/2325943》这篇博客文章时,你可以深入...
"生产者-消费者"模式是一种经典的并发设计模式,广泛应用于解决数据处理中的异步问题。本项目提供了一个简单的Java实现,帮助开发者理解如何在实际场景中运用这种模式。 生产者-消费者模式的核心思想是共享资源...
3. **生产者消费者模式**:文档会详细介绍如何设计生产者和消费者线程,如何通过阻塞队列进行通信。生产者通常调用`put()`将数据放入队列,消费者则调用`take()`从队列中取出数据。 4. **线程安全**:由于阻塞队列...
在Java编程中,"生产者-消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的主要目标是通过分离生产数据和消费数据的过程,提高系统的效率和灵活性。在这个模式中,"生产者"负责生成数据...
通过对生产者-消费者问题的理解和实践,可以深入掌握操作系统中的进程同步机制,这对于设计和优化多线程应用程序至关重要。在实际应用中,这种模型可以扩展到多个生产者和消费者,或者更复杂的系统架构,例如消息...
生产者-消费者模式利用阻塞队列来解耦两者,使得生产者生产完数据后无需等待消费者处理,而消费者也不需要知道数据何时产生,只需从队列中取数据。这里的阻塞队列实际上是一个有限的缓冲区,通常使用信号量(如互斥...
生产者与消费者模式是设计模式中的经典范例,它有效地展示了线程间的协作和同步。这个模式主要解决的问题是数据的生产和消费过程中的等待与协作问题。 在多线程环境下,生产者负责生成数据,而消费者则负责处理这些...
阻塞队列在生产者和消费者模式中起着关键的作用。Java中的`BlockingQueue`接口提供了几个实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`和`PriorityBlockingQueue`等,它们都实现了线程安全的队列操作。...
本文将深入探讨“多生产者-多消费者”模式,这是一种经典的线程同步问题,旨在优化资源的利用和提高系统的效率。在这个模式中,多个生产者线程生成数据,而多个消费者线程则负责消费这些数据。为了确保数据的一致性...
操作系统中的生产者-消费者问题是进程同步的经典案例,它涉及到多个并发执行的进程(在这里是生产者和消费者)如何协作共享有限资源(有界缓冲池)的问题。在这个问题中,生产者进程负责生产消息并放入缓冲池,而...
2. **阻塞队列**:在Java中,阻塞队列(如`ArrayBlockingQueue`)常用于生产者-消费者问题。当队列满时,生产者会被阻塞,直到队列有空位;当队列为空时,消费者会被阻塞,直到队列中有数据。这样可以避免资源浪费,...
生产者消费者模式基于操作系统提供的信号量(Semaphore)或管程(Monitor)等机制,以解决进程间的通信和同步问题。在这个模式中,生产者进程负责生成数据并放入缓冲区,而消费者进程则负责从缓冲区取出数据进行处理...
生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...
生产者-消费者问题是一个经典的进程同步问题,它在操作系统领域中被广泛讨论和研究。它描述的是两个共享一个缓冲区的进程(生产者和消费者)之间的交互问题。生产者负责生成数据并放入缓冲区,而消费者则从缓冲区中...
在Android开发中,生产者-消费者模式是一种常见的多线程设计模式,用于处理并发问题,尤其是在数据处理和异步操作中。这个模式的核心思想是通过一个共享的数据缓冲区,使得生产者线程可以生成数据并放入缓冲区,而...
"生产者-消费者"模型是多线程问题中的经典案例,它揭示了如何通过线程间的协作来实现数据共享和高效利用资源。今天我们将深入探讨这个主题。 生产者-消费者模型是由两个主要角色构成:生产者和消费者。生产者负责...