这里使用了BlockingQueue,实例化使用ArrayBlockingQueue。
BlockingQueue本来是就是线程安全的。
当然,也可以自己构建其他的容器类来实现。
如,concurrentHashMap , 使用线程安全synchronized 方法进行 ArrayList对象的get set。
或者用一个violate关键字声明的对象。
还有使用concurrentLock的。
方法多样,随你喜好:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//多线程之 生成者 消费者
public class TestConsumer {
/**
* 生产者
*/
class Producer implements Runnable{
final BlockingQueue queue ;
Producer(BlockingQueue q){
this.queue = q;
}
@Override
public void run() {
try{
for(int i =0 ;i<25;i++){
queue.put(produce()+i);
}
System.out.println("生产后:"+queue.peek());
}
catch(InterruptedException e){
e.printStackTrace();
}
}
String produce() {
return "产品 ";
}
}
/**
* 消费者
* @author wasw100
*/
class Consumer implements Runnable{
final BlockingQueue<String> queue;
Consumer(BlockingQueue q){
this.queue = q;
}
@Override
public void run() {
try{
while(true){
consume(queue.take());
Thread.sleep(1000);
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
void consume(String s){
System.out.println("Thread:"+Thread.currentThread().getName()+"消费:" + s);
}
}
//仓库,生产者消费者共享的资源,接口
private static BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
TestConsumer test = new TestConsumer();
Producer pro = test.new Producer(queue);
Consumer con1 = test.new Consumer(queue);
Consumer con2 = test.new Consumer(queue);
service.submit(pro);
service.submit(con1);
service.submit(con1);
try {
Thread.sleep(50500);
}
catch (Exception e) {
e.printStackTrace();
}
service.shutdown();
System.exit(0);
}
}
分享到:
相关推荐
在本场景中,我们关注的是一个经典的多线程问题——"生产者-消费者"模式。这个模式是解决资源管理与同步问题的一个有效策略,它在操作系统、并发编程和分布式系统等领域广泛应用。 生产者-消费者模型涉及到两个主要...
本示例“多线程BUFFER例子”是通过C++实现的,展示了如何在缓冲区(BUFFER)中实现消费者与生产者的并发操作。下面将详细解释这个主题中的关键知识点。 首先,我们要理解什么是生产者-消费者问题。这是一个经典的...
生产者-消费者问题是一个经典的多线程同步问题,它源于操作系统和并发编程领域。这个问题描述了两个角色:生产者和消费者,它们共享一个有限大小的缓冲区。生产者负责生成数据放入缓冲区,而消费者则从缓冲区取出...
### Linux下的多线程实例——生产者消费者模型 在Linux环境下进行多线程编程时,一个常见的应用场景就是通过生产者消费者模型来管理线程间的通信和数据共享问题。本篇文章将详细解析一个基于Linux环境下的多线程...
本话题将深入探讨一个经典的多线程问题——“生产者-消费者”模型,以及如何在VC++环境下利用信号和互斥量来解决这个问题。 生产者-消费者问题是一个典型的同步问题,涉及两个或多个线程之间的协作:生产者线程负责...
生产者和消费者问题是线程同步的经典例子,生产者负责生成数据,消费者负责消费数据。通过使用Monitor或Mutex等同步工具,可以确保生产者不会在缓冲区满时继续生产,消费者也不会在缓冲区空时尝试消费。 四、线程池...
本示例探讨的是一个经典的问题模型——生产者消费者问题。这个问题是并发编程中的一个典型场景,它模拟了实际生产环境中的供求关系,即一个线程(生产者)生成数据,另一个线程(消费者)则负责处理这些数据。 生产...
在这个场景下,我们关注的是一个经典的并发编程模型——生产者消费者模式。该模式是多进程同步的一种典型应用,通过它我们可以高效地管理数据的生产和消费。 生产者消费者模式基于操作系统提供的信号量(Semaphore...
操作系统中的生产者-消费者问题是一个经典的多线程同步问题,主要涉及进程间的通信与资源管理。在这个问题中,生产者负责生成数据,而消费者则负责处理这些数据。为避免生产者过快生产导致数据溢出,或者消费者过快...
在多线程环境中,生产者和消费者可以分别运行在不同的线程中,甚至在不同的处理器上。这样不仅可以提高系统的运行效率,还能优化资源使用,因为生产者和消费者可以并行地执行它们的任务。 第三个优点是支持忙闲不均...
生产者-消费者问题是并发编程中的一个典型例子,它模拟了两个或多个并发执行的实体——生产者和消费者——共享一个有限容量的缓冲区。生产者负责生成数据并放入缓冲区,而消费者则负责从缓冲区取出数据并消费。在...
生产者消费者模式是一种多线程同步问题的经典解决方案,它源于现实世界中的生产流水线,用于描述两种类型的参与者——生产者和消费者——如何有效地共享有限的资源。在这个模式中,生产者负责创建产品,而消费者则...
举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,...
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的高效利用问题。在Java中,我们可以使用内置的并发工具类来实现这个模式。以下是对该问题的详细解释: 生产者消费者模型是...
生产者-消费者问题是一种多线程或并发程序设计中的典型场景,主要涉及两个线程(或进程)之间的交互——生产者和消费者。生产者负责生成数据并将其放入共享缓冲区中,而消费者则负责从该缓冲区中取出数据并进行处理...
在这个"Java多线程之龟兔赛跑"的例子中,我们看到了如何使用Java的Thread类来创建和管理线程,模拟经典的寓言故事——龟兔赛跑。 首先,我们创建了一个名为`WuguiThread`的类,它继承自`Thread`。这个类代表乌龟...
总之,多线程之间的通讯通过共享对象和同步机制来实现,生产者和消费者模型是并发编程中解决资源分配和消费的经典案例。在Java中,我们可以利用内置的线程类和监视器机制来有效地处理这种类型的交互,确保数据的一致...
在"QSemaphore_Test"项目中,可能包含了这样的示例代码,演示了如何使用QSemaphore来同步多线程的生产者和消费者。这个例子值得深入学习,以便更好地理解和应用QSemaphore在实际项目中的功能。 总结起来,Qt5的...
在这个例子中,生产者和消费者通过调用wait()进入等待状态,并通过notify()唤醒对方。这样就实现了线程之间的同步和通信,避免了数据竞争和死锁等问题。 总的来说,Java线程通信安全问题主要涉及如何有效地管理共享...
生产者-消费者问题是多线程并发控制的一个经典范例,涉及到了线程间的协作与通信。在这个问题中,有两类线程:生产者负责生成产品并放入缓冲区,而消费者则负责从缓冲区取出产品并消费。关键在于如何保证生产者在...