目的
实现1个生产者和多个消费者合作工作的模式
手段
使用wait、notify和synchronized实现线程间同步;使用ConcurrentLinkedQueue同步队列
生成和消费的pojo类
public class AlarmBookPojo {
private int iDeviceId;
public int getiDeviceId() {
return iDeviceId;
}
public void setiDeviceId(int iDeviceId) {
this.iDeviceId = iDeviceId;
}
}
生产者和消费者同步的队列:
public class QueueMgr {
// 同步队列
ConcurrentLinkedQueue<AlarmBookPojo> queue = new ConcurrentLinkedQueue<AlarmBookPojo>();
private final static Byte[] synAlarm = new Byte[0]; //同步对象
/**
* 返回值有可能为null
* @return
*/
public AlarmBookPojo get(){
AlarmBookPojo o = null;
o = queue.poll();
if(o == null){
synchronized(synAlarm){
try {
synAlarm.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return o;
}
public boolean put(AlarmBookPojo o){
boolean bRtn = this.queue.offer(o);
synchronized(synAlarm){
synAlarm.notify();
}
return bRtn;
}
}
生产者:
public class Productor implements Runnable {
private QueueMgr queue;
private int i = 0;
public Productor(QueueMgr queue){
this.queue = queue;
}
public void generate(String sThreadName){
AlarmBookPojo o = new AlarmBookPojo();
o.setiDeviceId(i ++ );
queue.put(o);
System.out.println(sThreadName + "put pojo.");
}
public void run(){
while(true){
this.generate(Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
消费者
public class Consumer implements Runnable{
private QueueMgr queue;
public Consumer(QueueMgr queue){
this.queue = queue;
}
public void consumer(String sThreadName){
AlarmBookPojo o = queue.get();
if(o != null){
System.out.println(sThreadName + " Comsumer. o = " + o.getiDeviceId());
}
}
public void run(){
while(true){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.consumer(Thread.currentThread().getName());
}
}
}
main函数:
public class Main {
public static void main(String[] args){
QueueMgr q = new QueueMgr();
new Thread(new Consumer(q)).start();
new Thread(new Productor(q)).start();
// new Thread(new Productor(q)).start();
// new Thread(new Productor(q)).start();
new Thread(new Consumer(q)).start();
new Thread(new Consumer(q)).start();
}
}
执行以上程序,正常工作
Thread-1put pojo.
Thread-1put pojo.
Thread-0 Comsumer. o = 0
Thread-2 Comsumer. o = 1
Thread-1put pojo.
Thread-0 Comsumer. o = 2
Thread-1put pojo.
Thread-3 Comsumer. o = 3
参考文献:
分享到:
相关推荐
在"Kafka-java-demo"中,你将看到如何使用这些接口来实现一个简单的生产者和消费者示例。 【Kafka Producer】 Kafka生产者是负责将数据发布到Kafka主题的组件。在Java中,我们可以创建一个Producer实例,配置相关...
Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...
Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...
这有助于理解Java多线程编程中的同步原理和实践,对于提升并发编程能力大有裨益。 为了深入理解这个demo,你需要阅读并分析`TestProducerAndConsumer`的源代码,查看它如何初始化和使用队列、信号量或条件变量。...
Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类或者实现`Runnable`接口。这个压缩包文件"JAVA多...
1. **Java多线程**:Java通过`Thread`类和`Runnable`接口支持多线程编程。在这个示例中,可能会创建多个线程对象,每个对象负责处理队列中的一个任务,以实现并行执行。 2. **并发队列**:并发队列如`...
总结来说,"java多线程练习demo" 提供了一个学习和实践Java多线程的平台,通过“生产者消费者”和“龟兔赛跑”等例子,我们可以深入理解Java多线程编程的基本原理和实践技巧。这些知识对于开发高并发、高性能的Java...
在这个示例中,我们将关注如何使用Java API在Kafka中实现多线程消费,以及单个消费者组内的多线程消费。 首先,我们了解Kafka的基本概念。Kafka是一个发布/订阅模型的消息队列,它包含生产者(Producer)、消费者...
在本项目中,我们探索了如何将Spring MVC框架与多线程、线程池和Apache Kafka集成,构建一个高效的数据处理系统。以下是关于这些技术及其整合的详细知识点: 1. **Spring MVC**: - Spring MVC是Spring框架的一个...
本示例"java多线程的条件对象和锁对象demo"着重探讨了如何利用锁对象和条件对象来精细控制线程的执行流程。 首先,我们需要了解Java中的锁对象。Java提供了多种类型的锁,其中最基础的是`synchronized`关键字,它...
在实际应用中,生产者和消费者可能需要在多线程环境中运行,以提高吞吐量和响应速度。因此,理解Java的并发机制和线程安全非常重要。 8. **性能优化**: 对于大规模的消息传递,可能需要考虑使用预分配的缓冲区、...
总的来说,这个Kafka Demo项目为学习和实践Kafka提供了很好的起点,涵盖了消费者模型、线程并行处理等核心概念,对于想要深入理解Kafka的开发者来说,是一份非常有价值的资源。通过分析和运行这个项目,不仅可以了解...
操作系统中的“生产者消费者问题”是一个经典的多线程同步模型,它主要涉及到进程通信和资源管理,对于理解和解决并发编程中的同步与互斥问题具有重要的理论价值和实践意义。在这个DEMO中,我们将深入探讨这个问题...
`demo.docx`可能包含各种多线程编程的示例,如生产者消费者模型、银行转账场景等。`API.docx`可能详细列出了相关类和方法的使用。`多线程.docx`可能是关于Java多线程的深入讲解,涵盖线程安全、线程同步、锁的使用等...
今天,我们通过一个demo代码实例来学习Java多线程并发执行的实现。 知识点1:泛型 在上面的代码中,我们可以看到泛型的使用,例如`public abstract class MultiThread, T>`。泛型是Java 5中引入的一种机制,它可以...
生产者消费者模式是一种多线程设计模式,它用于解决生产数据和消费数据的同步问题,以避免生产者过快生产导致资源浪费,或者消费者过快消费导致无数据可处理的情况。这种模式通常由两个主要角色构成:生产者...
在“java定时器+多线程(池)+java队列Demo”这个项目中,我们将深入探讨这三个核心概念。 1. **Java定时器(java.util.Timer)**:`Timer`类用于调度周期性的任务执行。它可以安排一个任务在未来某个时间点或定期...
另外,还有java.util.concurrent包下的BlockingQueue,它可以作为线程间的生产者-消费者模型,实现线程安全的数据交换。 此外,死锁、活锁和饥饿也是多线程编程中需要关注的问题。死锁是指两个或更多线程相互等待...
多线程生产者与消费者 在提供的`producerThread`和`consumerThread`中,可能涉及将生产者和消费者任务放入单独的线程中,以实现并发处理。这可以通过创建Java的Thread类子类,或者使用ExecutorService和Callable/...