好久不写东西了,写点小东西吧,呵呵
这是一个简单的生产者-消费者例子(取自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();
}
}
分享到:
相关推荐
7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、添加数据到队列、从队列中取出数据、以及使用同步机制保证正确性的代码片段。通过对这些例程的分析和运行,可以...
在我们的例子中,有一个生产者和两个消费者,这意味着数据生成的速度和消费的速度是不同的,需要通过多线程来协调它们之间的交互。 为了实现这个模式,我们需要确保以下条件得到满足: 1. **互斥访问**:当生产者...
本文将深入探讨“多生产者-多消费者”模式,这是一种经典的线程同步问题,旨在优化资源的利用和提高系统的效率。在这个模式中,多个生产者线程生成数据,而多个消费者线程则负责消费这些数据。为了确保数据的一致性...
生产者使用`put()`将产品放入队列,消费者使用`take()`获取产品,当队列满或空时,这些操作会自动阻塞对应的操作,实现线程间的协调。 3. **示例代码**:一个简单的生产者-消费者模型可以通过创建一个固定大小的`...
在`Producer_Consumer`文件中,可能包含实现这个例子的源代码,包括生产者和消费者线程的定义、互斥量的创建和使用,以及可能的MFC界面元素,如按钮和进度条,用于可视化显示生产与消费的过程。通过分析和学习这个...
在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者-消费者模式。`BlockingQueue`接口是最常用的实现方式,它提供了线程安全的数据结构,可以用来作为生产者和消费者之间的缓冲区。例如,我们...
在此模式中,通常使用队列作为缓冲区,同时利用互斥量和条件变量来同步生产者和消费者的动作。 以下是一个简单的生产者-消费者模式的C++实现: ```cpp #include #include #include #include std::queue<int> ...
在每次生产或消费后,程序会显示当前的时间、生产者和消费者的生产消费状况,以及缓冲区的使用状况。使用`sleep(1)`函数暂停1秒,以模拟实时的生产消费过程,使得用户可以看到每一步的变化。 整个程序通过控制生产...
在这个"模仿线程"生产者与消费者"的例子中,我们将深入探讨这个经典的并发设计模式及其背后的原理。 生产者-消费者模式是一种典型的同步问题,用于解决数据生产与消费的异步处理。在这个模型中,生产者线程负责创建...
在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...
在我们的例子中,互斥量可以用于保护缓冲区的访问,防止生产者和消费者同时修改缓冲区的状态。生产者和消费者在存取数据前都需要获取互斥量,完成操作后再释放,这样可以确保数据的一致性。 C++代码中,可能包含...
在测试用例文件中指定了所有的生产和消费的需求,只有当共享缓冲区的数据满足了所有关于它的消费需求后,此共享缓冲区才可以作为空闲空间允许新的生产者使用。 本实验在为生产者分配缓冲区时各生产者间必须互斥,...
在这个例子中,每个生产者和消费者任务都有自己的优先级,以确保系统的高效运行。生产者可能需要更高的优先级以快速插入商品,而消费者可能有较低的优先级,因为他们可以稍后处理数据。 同步操作是解决生产者-消费...
在这个例子中,"并行openmp程序实现生产者消费者"可能是通过OpenMP库来创建两个线程,一个扮演生产者的角色,另一个扮演消费者的角色。生产者线程负责生成数据,而消费者线程则处理这些数据。这种模式在处理大量数据...
使用条件变量(Condition Variable)来同步生产者和消费者的动作,确保消费者只在缓冲区非空时取数据,生产者在缓冲区非满时生产数据。 在"IPC-model"这个压缩包中,可能包含的代码示例会展示如何定义和初始化这些...
在这个例子中,可能会有两个任务,一个是生产者任务,负责填充一个共享的数据缓冲区;另一个是消费者任务,负责从缓冲区中取出数据并进行处理。 接着,我们来看信号量的角色。在生产者-消费者模型中,信号量通常...
QT窗口界面模拟生产者消费者程序是一种使用QT框架创建的图形用户界面(GUI)应用程序,它实现了生产者-消费者问题的经典并发模型。生产者-消费者问题是一个多线程设计模式,通常用于解决数据处理中的同步问题。在这...
操作系统中的“消费者-生产者问题”(Producer-Consumer Problem)是一个经典的多线程同步问题,主要涉及进程间的通信和资源管理。在安卓系统中,这一概念同样被广泛应用,尤其是在处理数据流、UI更新以及后台任务时...
在这个例子中,代码展示了如何使用同步方法(`synchronized` 关键字)来模拟 PV 操作,并解决了生产者-消费者问题。 ##### 容器类 `RongQi` - **成员变量**: - `String food[]`:用于存储生产者产生的数据(这里...