`

基于java多线程方式的生产者消费者模式实现

阅读更多
第一种实现:
//这种实现有一个问题,produce和consume用的是同一把锁。所以生产的时候就不能消费,消费的时候不能生产.
public class Storage implements StorageInterface{
	private  final int MAX_NUM  = 100;
	private LinkedList<Object> lists = new LinkedList<Object>();
	
	public void  produce(int num){
		synchronized (lists) {
			while(num+lists.size()>MAX_NUM){
				try {
					System.out.println("暂时不能生产"+num+"个任务,当前库存为:"+lists.size());
					lists.wait();
					
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			for(int i=0;i<num;i++){
				lists.add(new Object());
				System.out.println("生产了"+i+"个商品,当前库存为:"+lists.size());
			}
			
			lists.notifyAll();
			
		}
		
		
	}
	
	public void consume(int num){
		synchronized (lists) {
			while(lists.size()<num){
				try {
					System.out.println("暂时不能消费"+num+"个任务,当前剩余任务数:"+lists.size());
					lists.wait();
					
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for(int i=0;i<lists.size();i++){
				lists.remove(i);
				System.out.println("消费了"+i+"个商品,还剩产品数:"+lists.size());
			}
			lists.notifyAll();
		}
		
	}
}



第二种实现:既能消费又能生产的实现.利用BlockingQueue来实现.
public class StorageWithQueen implements StorageInterface{
	private  final int MAX_NUM  = 100;
	private final BlockingQueue<Object> blockingQueue = new LinkedBlockingQueue<>(MAX_NUM);
	public void  produce(int num) {
			if(blockingQueue.size()==MAX_NUM){
				System.out.println("暂时不能生产"+num+"个任务,当前库存为:"+blockingQueue.size());
			}
			
			for(int i=0;i<num;i++){
				try {
					
					blockingQueue.put(new Object());
					System.out.println("生产了"+(i+1)+"个商品,当前库存为:"+blockingQueue.size());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
			
		
		
		
	}
	
	public void consume(int num){
			if(blockingQueue.size()==0){
				System.out.println("暂时不能消费"+num+"个任务,当前剩余任务数:"+blockingQueue.size());
			}
			for(int i=0;i<blockingQueue.size();i++){
				try {
					
					blockingQueue.take();
					System.out.println("消费了"+(i+1)+"个商品,还剩产品数:"+blockingQueue.size());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
		
		
	}
}


分享到:
评论

相关推荐

    java多线程实现生产者和消费者

    通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。

    java 基于队列实现的生产消费者模式

    基于队列实现的生产消费者模式java 源码,并且采用多线程进行消费

    java生产者消费者demo

    这有助于理解Java多线程编程中的同步原理和实践,对于提升并发编程能力大有裨益。 为了深入理解这个demo,你需要阅读并分析`TestProducerAndConsumer`的源代码,查看它如何初始化和使用队列、信号量或条件变量。...

    Java多线程 BlockingQueue实现生产者消费者模型详解

    Java多线程BlockingQueue实现生产者消费者模型详解 Java多线程中,生产者消费者模型是非常重要的一种设计模式,它可以解决多线程之间的数据传输问题。在Java中,我们可以使用BlockingQueue来实现生产者消费者模型,...

    java 多线程并发实例

    - 生产者-消费者模型:这是一个经典的多线程设计模式,用于解决资源的生产与消费问题。生产者线程负责生成数据,放入缓冲区;消费者线程则负责取出数据进行处理。Java的BlockingQueue接口(如ArrayBlockingQueue)...

    操作系统课程设计多线程 生产者消费者问题

    综上所述,这个"操作系统课程设计多线程 生产者消费者问题"项目将涵盖Java多线程编程、并发控制、线程安全的数据结构和通信机制等多个重要知识点,对理解并发编程有极大的实践价值。在实际操作中,需要综合运用这些...

    java 编写的生产者与消费者问题

    在计算机科学中,生产者-消费者问题是多线程并发控制中的一个经典问题。该问题描述了两个并发执行的进程——生产者和消费者,它们共享一个有限大小的缓冲区。生产者进程负责生成数据(消息)并放入缓冲区,而消费者...

    Java 生产消费者模式

    5. **死锁与饥饿**:在实现生产消费者模式时,要防止死锁(两个或更多线程相互等待对方释放资源)和饥饿(某个线程因资源不足或优先级问题无法获得执行机会)。合理设置队列大小、使用适当的同步机制可以避免这些...

    JAVA多线程模式高清版+DEMO

    - 生产者-消费者模式:使用`BlockingQueue`实现线程间的生产与消费。 - 线程池模式:通过`ExecutorService`实现线程复用,避免频繁创建销毁线程。 - 单例模式在多线程环境下的应用:确保类只有一个实例,通常使用...

    消息分发框架(基于JAVA阻塞队列实现、 生产者消费者模型)

    综上所述,"消息分发框架(基于JAVA阻塞队列实现、生产者消费者模型)"是一个关键的并发处理组件,通过Java提供的并发工具和设计模式,实现了高效、稳定的消息处理。在实际应用中,需要根据业务需求进行适当的性能...

    kafka demo ,两种线程消费方式

    在这个示例中,我们将关注如何使用Java API在Kafka中实现多线程消费,以及单个消费者组内的多线程消费。 首先,我们了解Kafka的基本概念。Kafka是一个发布/订阅模型的消息队列,它包含生产者(Producer)、消费者...

    java生产者与消费者实验报告

    通过本次实验,不仅加深了对Java并发编程的理解,还掌握了如何在多线程环境下实现生产者与消费者模型,确保数据的线程安全和一致性。实验过程中,使用Eclipse IDE搭建开发环境,通过编写和调试代码,成功实现了三个...

    java生产者消费者模式

    【生产者消费者模式】是一种经典的多线程设计模式,用于解决资源的共享和并发访问问题。在该模式中,生产者负责创建产品并放入共享的缓冲区,而消费者则从缓冲区取出产品进行消费。这种模式的核心是确保生产者与消费...

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

    在Java开发中,生产者消费者模式是一种常见的多线程设计模式,它允许生产者线程创建数据并放入队列,而消费者线程则从队列中取出并处理这些数据,两者之间无需直接交互,有效解耦了系统组件。在这个场景中,阻塞队列...

    java生产者消费者图形界面模拟

    总的来说,这个Java课程设计通过图形化的方式深入浅出地展示了生产者消费者模式的工作原理,让学生能够直观地理解多线程环境下资源管理的重要性,以及如何通过并发控制来提高程序的效率。通过实际编写和运行代码,...

    生产者消费者 java

    ### 生产者消费者模型在Java中的实现 #### 概述 生产者消费者模型是一种经典的多线程编程模式,被广泛应用于解决并发环境下的数据生产和消费问题。在这个模型中,“生产者”负责创建数据并将其放入缓冲区(通常是...

    Java多线程编辑核心技术

    另外,java.util.concurrent包中的BlockingQueue等阻塞队列可以用来实现线程间的通信和数据交换,它在生产者-消费者模式中非常有用。 在实际开发中,使用Java多线程技术时,开发者可能会面临一些挑战,比如线程安全...

    精选_毕业设计_基于JAVA的生产者消费者问题_完整源码

    在这个“精选_毕业设计_基于JAVA的生产者消费者问题_完整源码”项目中,开发者通过Java语言实现了一个解决方案,旨在教授如何在实际应用中处理这种问题。以下是对该项目的详细解析: 生产者消费者问题是多线程编程...

    Java多线程设计模式.pdf

    从给定的信息来看,文档标题和描述均指出是关于...以上介绍了几种常见的Java多线程设计模式及其应用场景和实现方式。通过这些模式的应用,开发者可以更加高效、安全地管理多线程程序,提高软件的整体性能和可靠性。

Global site tag (gtag.js) - Google Analytics