`

生产者-使用者例子

阅读更多

好久不写东西了,写点小东西吧,呵呵

这是一个简单的生产者-消费者例子(取自java 6.0 api介绍java.util.concurrent 接口 BlockingQueue时举的例子)

class Producer implements Runnable { 
   private final BlockingQueue queue; 
   Producer(BlockingQueue q) { queue = q; } 
   public void run() { 
     try { 
       while(true) { queue.put(produce()); } 
     } catch (InterruptedException ex) { ... handle ...} 
   } 
   Object produce() { ... } 
} 

class Consumer implements Runnable { 
   private final BlockingQueue queue; 
   Consumer(BlockingQueue q) { queue = q; } 
   public void run() { 
     try { 
       while(true) { consume(queue.take()); } 
     } catch (InterruptedException ex) { ... handle ...} 
   } 
   void consume(Object x) { ... } 
} 

class Setup { 
   void main() { 
     BlockingQueue q = new SomeQueueImplementation(); 
     Producer p = new Producer(q); 
     Consumer c1 = new Consumer(q); 
     Consumer c2 = new Consumer(q); 
     new Thread(p).start(); 
     new Thread(c1).start(); 
     new Thread(c2).start(); 
   } 
} 

 


这个例子非常易于理解,特征明显,属于典型案例,但我们平时的应用一般不会无限循环下去,我们需要消费者在生产者结束后把queue中的数据获取出来、做完相应的操作以后结束生产消费过程。 针对该需求可以修改一下程序,做一个单生产者的例子,如下:

class Producer implements Runnable { 
   private final BlockingQueue queue; 
   Producer(BlockingQueue q) { queue = q; } 
   public void run() { 
     try { 
       while(生产条件) { queue.put(produce()); } 
     } catch (InterruptedException ex) { ... handle ...} 
   } 
   Object produce() { ... } 
} 

class Consumer implements Runnable { 
   private final BlockingQueue queue; 
   private Thread p; 
   Consumer(BlockingQueue q,Thread producer) { queue = q; p = producer;} 
   public void run() { 
     try { 
       while(!p.isAlive()||!queue.isEmpty()) {//循环直到生产者线程结束并且把queue中的数据全部获取完 
   consume(queue.take()); } 
     } catch (InterruptedException ex) { ... handle ...} 
   } 
   void consume(Object x) { ... } 
} 

class Setup { 
   void main() { 
     BlockingQueue q = new SomeQueueImplementation(); 
     Producer p = new Producer(q); 
     Consumer c1 = new Consumer(q); 
     Consumer c2 = new Consumer(q); 
     new Thread(p).start(); 
     new Thread(c1).start(); 
     new Thread(c2).start(); 
   } 
} 

 

有时候会有多生产者,再写一个多生产者的例子,如下:

public class Test { 

private ExecutorService producerPool = Executors.newFixedThreadPool(5); 

private ExecutorService consumerPool = Executors.newFixedThreadPool(5); 

private BlockingQueue queue = new ArrayBlockingQueue(100); 

public void t() { 

for (int i = 0; i  0) { 
String s = null; 
try { 
s = queue.take(); 
System.out.println("get a product:"+s); 
} catch (InterruptedException e) { 
e.printStackTrace(); 
} 
} 

System.out.println("consumer-" + Thread.currentThread().getName() + " is done!"); 
} 
}; 
consumerPool.submit(consumer); 
} 
consumerPool.shutdown(); 
} 

public static void main(String[] args){ 

new Test().t(); 

} 
} 

 

分享到:
评论

相关推荐

    生产者-消费者问题的模拟实现(课设含源代码).doc

    生产者-消费者问题是操作系统中经典的进程同步问题,它模拟了实际生产环境中的资源分配与消耗。在这个问题中,生产者进程负责生成数据并放入有限大小的缓冲区,而消费者进程则从缓冲区取出数据进行消费。为了确保...

    labview 生产者消费者例子

    7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、添加数据到队列、从队列中取出数据、以及使用同步机制保证正确性的代码片段。通过对这些例程的分析和运行,可以...

    生产者-消费者多线程处理

    在我们的例子中,有一个生产者和两个消费者,这意味着数据生成的速度和消费的速度是不同的,需要通过多线程来协调它们之间的交互。 为了实现这个模式,我们需要确保以下条件得到满足: 1. **互斥访问**:当生产者...

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

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

    JAVA_生产者-消费者

    生产者使用`put()`将产品放入队列,消费者使用`take()`获取产品,当队列满或空时,这些操作会自动阻塞对应的操作,实现线程间的协调。 3. **示例代码**:一个简单的生产者-消费者模型可以通过创建一个固定大小的`...

    线程同步(生产者--消费者问题)

    在`Producer_Consumer`文件中,可能包含实现这个例子的源代码,包括生产者和消费者线程的定义、互斥量的创建和使用,以及可能的MFC界面元素,如按钮和进度条,用于可视化显示生产与消费的过程。通过分析和学习这个...

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

    在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者-消费者模式。`BlockingQueue`接口是最常用的实现方式,它提供了线程安全的数据结构,可以用来作为生产者和消费者之间的缓冲区。例如,我们...

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    在此模式中,通常使用队列作为缓冲区,同时利用互斥量和条件变量来同步生产者和消费者的动作。 以下是一个简单的生产者-消费者模式的C++实现: ```cpp #include #include #include #include std::queue<int> ...

    利用数组解决生产者消费者问题

    在每次生产或消费后,程序会显示当前的时间、生产者和消费者的生产消费状况,以及缓冲区的使用状况。使用`sleep(1)`函数暂停1秒,以模拟实时的生产消费过程,使得用户可以看到每一步的变化。 整个程序通过控制生产...

    模仿线程"生产者与消费者"的例子

    在这个"模仿线程"生产者与消费者"的例子中,我们将深入探讨这个经典的并发设计模式及其背后的原理。 生产者-消费者模式是一种典型的同步问题,用于解决数据生产与消费的异步处理。在这个模型中,生产者线程负责创建...

    java多线程例子-生产者消费者

    在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...

    生产者消费者代码(C++版)

    在我们的例子中,互斥量可以用于保护缓冲区的访问,防止生产者和消费者同时修改缓冲区的状态。生产者和消费者在存取数据前都需要获取互斥量,完成操作后再释放,这样可以确保数据的一致性。 C++代码中,可能包含...

    操作系统课程设计生产者和消费者问题源代码

    在测试用例文件中指定了所有的生产和消费的需求,只有当共享缓冲区的数据满足了所有关于它的消费需求后,此共享缓冲区才可以作为空闲空间允许新的生产者使用。 本实验在为生产者分配缓冲区时各生产者间必须互斥,...

    uCOS-II实现的生产者消费者多任务演示程序

    在这个例子中,每个生产者和消费者任务都有自己的优先级,以确保系统的高效运行。生产者可能需要更高的优先级以快速插入商品,而消费者可能有较低的优先级,因为他们可以稍后处理数据。 同步操作是解决生产者-消费...

    并行openmp程序实现生产者消费者

    在这个例子中,"并行openmp程序实现生产者消费者"可能是通过OpenMP库来创建两个线程,一个扮演生产者的角色,另一个扮演消费者的角色。生产者线程负责生成数据,而消费者线程则处理这些数据。这种模式在处理大量数据...

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

    使用条件变量(Condition Variable)来同步生产者和消费者的动作,确保消费者只在缓冲区非空时取数据,生产者在缓冲区非满时生产数据。 在"IPC-model"这个压缩包中,可能包含的代码示例会展示如何定义和初始化这些...

    uCOS-II.rar_ucos 生产 消费者_ucos 生产者 消费者_生产者消费者

    在这个例子中,可能会有两个任务,一个是生产者任务,负责填充一个共享的数据缓冲区;另一个是消费者任务,负责从缓冲区中取出数据并进行处理。 接着,我们来看信号量的角色。在生产者-消费者模型中,信号量通常...

    QT窗口界面模拟生产者消费者

    QT窗口界面模拟生产者消费者程序是一种使用QT框架创建的图形用户界面(GUI)应用程序,它实现了生产者-消费者问题的经典并发模型。生产者-消费者问题是一个多线程设计模式,通常用于解决数据处理中的同步问题。在这...

    操作系统-消费者-生产者安卓实现

    操作系统中的“消费者-生产者问题”(Producer-Consumer Problem)是一个经典的多线程同步问题,主要涉及进程间的通信和资源管理。在安卓系统中,这一概念同样被广泛应用,尤其是在处理数据流、UI更新以及后台任务时...

Global site tag (gtag.js) - Google Analytics