`
nannan408
  • 浏览: 1783263 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

阻塞队列和生产者-消费者模式 (引用)

阅读更多
自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
分享到:
评论

相关推荐

    用多进程同步方法解决生产者-消费者问题

    生产者-消费者问题是计算机科学中的一个经典问题,主要涉及多线程或多进程同步。这个问题在操作系统课程中常被用来讲解进程间的通信和同步机制。在这个场景中,我们讨论的是在Linux环境下,如何通过多进程的方式解决...

    模拟“生产者-消费者”解决过程及方法

    生产者-消费者问题可以关联到软件设计模式中的"生产者-消费者模式"和"阻塞队列模式"。这些模式在多线程编程中广泛应用于处理异步任务和数据流。 6. **优化策略**: - **批量生产/消费**:生产者一次性生产多个...

    Java多线程 生产者-消费者模式

    总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...

    生产者-消费者.zip

    "生产者-消费者"模式是一种经典的并发设计模式,广泛应用于解决数据处理中的异步问题。本项目提供了一个简单的Java实现,帮助开发者理解如何在实际场景中运用这种模式。 生产者-消费者模式的核心思想是共享资源...

    生产者/消费者模式 阻塞队列 LinkedBlockingQueue

    了解并熟练运用生产者/消费者模式以及像LinkedBlockingQueue这样的阻塞队列,对于优化多线程程序的性能和简化并发编程的复杂性至关重要。在阅读《xiongjiajia.iteye.com/blog/2325943》这篇博客文章时,你可以深入...

    阻塞队列实现生产者消费者模式Java开发Java经验技巧共

    3. **生产者消费者模式**:文档会详细介绍如何设计生产者和消费者线程,如何通过阻塞队列进行通信。生产者通常调用`put()`将数据放入队列,消费者则调用`take()`从队列中取出数据。 4. **线程安全**:由于阻塞队列...

    JAVA_生产者-消费者

    在Java编程中,"生产者-消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的主要目标是通过分离生产数据和消费数据的过程,提高系统的效率和灵活性。在这个模式中,"生产者"负责生成数据...

    生产者和消费者模式多线程

    阻塞队列在生产者和消费者模式中起着关键的作用。Java中的`BlockingQueue`接口提供了几个实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`和`PriorityBlockingQueue`等,它们都实现了线程安全的队列操作。...

    多线程_生产者与消费者模式示例

    生产者与消费者模式是设计模式中的经典范例,它有效地展示了线程间的协作和同步。这个模式主要解决的问题是数据的生产和消费过程中的等待与协作问题。 在多线程环境下,生产者负责生成数据,而消费者则负责处理这些...

    操作系统课件中生产者-消费者进程同步问题的程序

    通过对生产者-消费者问题的理解和实践,可以深入掌握操作系统中的进程同步机制,这对于设计和优化多线程应用程序至关重要。在实际应用中,这种模型可以扩展到多个生产者和消费者,或者更复杂的系统架构,例如消息...

    多线程间通信:多生产者-多消费者实例

    本文将深入探讨“多生产者-多消费者”模式,这是一种经典的线程同步问题,旨在优化资源的利用和提高系统的效率。在这个模式中,多个生产者线程生成数据,而多个消费者线程则负责消费这些数据。为了确保数据的一致性...

    计算机操作系统课程设计报告《生产者---消费者问题》.doc

    生产者-消费者模式利用阻塞队列来解耦两者,使得生产者生产完数据后无需等待消费者处理,而消费者也不需要知道数据何时产生,只需从队列中取数据。这里的阻塞队列实际上是一个有限的缓冲区,通常使用信号量(如互斥...

    多进程同步-生产者消费者模式-C实现

    生产者消费者模式基于操作系统提供的信号量(Semaphore)或管程(Monitor)等机制,以解决进程间的通信和同步问题。在这个模式中,生产者进程负责生成数据并放入缓冲区,而消费者进程则负责从缓冲区取出数据进行处理...

    生产者 消费者 模式 c++

    生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...

    android 生产者消费者模式

    在Android开发中,生产者-消费者模式是一种常见的多线程设计模式,用于处理并发问题,尤其是在数据处理和异步操作中。这个模式的核心思想是通过一个共享的数据缓冲区,使得生产者线程可以生成数据并放入缓冲区,而...

    操作系统实验报告_生产者-消费者问题算法的实现.doc

    操作系统中的生产者-消费者问题是进程同步的经典案例,它涉及到多个并发执行的进程(在这里是生产者和消费者)如何协作共享有限资源(有界缓冲池)的问题。在这个问题中,生产者进程负责生产消息并放入缓冲池,而...

    模拟生产者消费者问题(java)

    2. **阻塞队列**:在Java中,阻塞队列(如`ArrayBlockingQueue`)常用于生产者-消费者问题。当队列满时,生产者会被阻塞,直到队列有空位;当队列为空时,消费者会被阻塞,直到队列中有数据。这样可以避免资源浪费,...

    架构设计 -- 生产者/消费者模式

    【生产者/消费者模式】是一种常见的并发编程和系统设计模式,它主要解决的是在多线程环境下,如何协调生产者和消费者之间的数据处理问题。在软件开发中,生产者通常是生成数据的一方,而消费者则是处理这些数据的...

    Qt中使用QSemaphore,单生产者—多消费者模型

    在多线程编程中,`QSemaphore`常被用来实现生产者-消费者模型,其中生产者线程生产数据,而消费者线程消费数据。这种模型对于并发处理和优化系统性能具有重要意义。 在“Qt中使用QSemaphore,单生产者—多消费者...

Global site tag (gtag.js) - Google Analytics