- 浏览: 62937 次
- 性别:
- 来自: 成都
文章分类
最新评论
第一种实现:
第二种实现:既能消费又能生产的实现.利用BlockingQueue来实现.
//这种实现有一个问题,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(); } } } }
发表评论
-
读ThreadLocal源代码
2017-10-12 15:00 239//可以存取线程局部变量 //先看构造函数 pub ... -
读Exchanger源码
2017-10-10 11:38 331//用于线程间交换数据 public V exchang ... -
读Executors源码
2017-09-29 15:23 260//一个管理线程创建的类里面都是静态方法 //创建一 ... -
读ScheduledThreadPoolExecutor源码
2017-09-25 17:33 412//一个可以延迟执行的定时任务 //先看构造函数 构造函 ... -
读部分ThreadPoolExecutor源码
2017-09-25 15:27 304//线程池 //先看构造方法 public Threa ... -
读AbstractExecutorService
2017-09-23 16:34 323//他是ExecutorService的部分实现 pub ... -
读ExecutorCompletionService源码
2017-09-23 11:22 485//一个用来管理已完成任务的service,内部封装了一个 ... -
读FutureTask源码
2017-09-22 16:45 269//一个可以异步返回计算的结果 //它同时实现了Futu ... -
读ConcurrentSkipListMap源码
2017-09-21 15:11 289//数据结构是跳表 关于数据结构http://blog.c ... -
读Semaphore源码
2017-09-09 14:58 292//一个信号量,只有在池中还拥有许可时才允许线程继续执行。 ... -
读CyclicBarrier源码
2017-09-01 17:59 344//一个循环的屏障。所有的线程在屏障处等待其他线程执行完毕 ... -
读CountDownLatch源码
2017-09-01 14:01 321//在完成一组操作之前允许一个或多个线程等待内部用的AQS ... -
读ConcurrentLinkedQueue
2017-09-01 11:40 286//这是一个无阻塞的队列没有加任何锁全部利用CAS机制实现 ... -
读ConcurrentHashMap源码
2017-08-31 11:21 273//先看构造函数 public ConcurrentHa ... -
读CopyOnWriteArrayList源码
2017-08-22 12:59 407//在该集合上的写操作都是在原有的副本上进行的操作。这样可 ... -
读LinkedBlockingDeque源码
2017-08-21 14:26 561//这是一个支持双端操作的可阻塞队列 //先看构造函数 ... -
读SynchronousQueue源码
2017-08-10 10:51 374//先看构造方法 public SynchronousQ ... -
读PriorityBlocking源码
2017-08-09 13:47 353//一个基于而为堆的优先级队列,它是无界的。 //先看构 ... -
读DelayQueen源码
2017-08-07 15:16 274//一个基于二叉堆优先 ... -
LinkedblockingQueue源码解读
2017-08-04 13:03 348//LinkedBlockQueue //先看构造函数 ...
相关推荐
通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。
基于队列实现的生产消费者模式java 源码,并且采用多线程进行消费
这有助于理解Java多线程编程中的同步原理和实践,对于提升并发编程能力大有裨益。 为了深入理解这个demo,你需要阅读并分析`TestProducerAndConsumer`的源代码,查看它如何初始化和使用队列、信号量或条件变量。...
Java多线程BlockingQueue实现生产者消费者模型详解 Java多线程中,生产者消费者模型是非常重要的一种设计模式,它可以解决多线程之间的数据传输问题。在Java中,我们可以使用BlockingQueue来实现生产者消费者模型,...
- 生产者-消费者模型:这是一个经典的多线程设计模式,用于解决资源的生产与消费问题。生产者线程负责生成数据,放入缓冲区;消费者线程则负责取出数据进行处理。Java的BlockingQueue接口(如ArrayBlockingQueue)...
综上所述,这个"操作系统课程设计多线程 生产者消费者问题"项目将涵盖Java多线程编程、并发控制、线程安全的数据结构和通信机制等多个重要知识点,对理解并发编程有极大的实践价值。在实际操作中,需要综合运用这些...
在计算机科学中,生产者-消费者问题是多线程并发控制中的一个经典问题。该问题描述了两个并发执行的进程——生产者和消费者,它们共享一个有限大小的缓冲区。生产者进程负责生成数据(消息)并放入缓冲区,而消费者...
5. **死锁与饥饿**:在实现生产消费者模式时,要防止死锁(两个或更多线程相互等待对方释放资源)和饥饿(某个线程因资源不足或优先级问题无法获得执行机会)。合理设置队列大小、使用适当的同步机制可以避免这些...
- 生产者-消费者模式:使用`BlockingQueue`实现线程间的生产与消费。 - 线程池模式:通过`ExecutorService`实现线程复用,避免频繁创建销毁线程。 - 单例模式在多线程环境下的应用:确保类只有一个实例,通常使用...
综上所述,"消息分发框架(基于JAVA阻塞队列实现、生产者消费者模型)"是一个关键的并发处理组件,通过Java提供的并发工具和设计模式,实现了高效、稳定的消息处理。在实际应用中,需要根据业务需求进行适当的性能...
在这个示例中,我们将关注如何使用Java API在Kafka中实现多线程消费,以及单个消费者组内的多线程消费。 首先,我们了解Kafka的基本概念。Kafka是一个发布/订阅模型的消息队列,它包含生产者(Producer)、消费者...
通过本次实验,不仅加深了对Java并发编程的理解,还掌握了如何在多线程环境下实现生产者与消费者模型,确保数据的线程安全和一致性。实验过程中,使用Eclipse IDE搭建开发环境,通过编写和调试代码,成功实现了三个...
【生产者消费者模式】是一种经典的多线程设计模式,用于解决资源的共享和并发访问问题。在该模式中,生产者负责创建产品并放入共享的缓冲区,而消费者则从缓冲区取出产品进行消费。这种模式的核心是确保生产者与消费...
在Java开发中,生产者消费者模式是一种常见的多线程设计模式,它允许生产者线程创建数据并放入队列,而消费者线程则从队列中取出并处理这些数据,两者之间无需直接交互,有效解耦了系统组件。在这个场景中,阻塞队列...
总的来说,这个Java课程设计通过图形化的方式深入浅出地展示了生产者消费者模式的工作原理,让学生能够直观地理解多线程环境下资源管理的重要性,以及如何通过并发控制来提高程序的效率。通过实际编写和运行代码,...
### 生产者消费者模型在Java中的实现 #### 概述 生产者消费者模型是一种经典的多线程编程模式,被广泛应用于解决并发环境下的数据生产和消费问题。在这个模型中,“生产者”负责创建数据并将其放入缓冲区(通常是...
另外,java.util.concurrent包中的BlockingQueue等阻塞队列可以用来实现线程间的通信和数据交换,它在生产者-消费者模式中非常有用。 在实际开发中,使用Java多线程技术时,开发者可能会面临一些挑战,比如线程安全...
在这个“精选_毕业设计_基于JAVA的生产者消费者问题_完整源码”项目中,开发者通过Java语言实现了一个解决方案,旨在教授如何在实际应用中处理这种问题。以下是对该项目的详细解析: 生产者消费者问题是多线程编程...
从给定的信息来看,文档标题和描述均指出是关于...以上介绍了几种常见的Java多线程设计模式及其应用场景和实现方式。通过这些模式的应用,开发者可以更加高效、安全地管理多线程程序,提高软件的整体性能和可靠性。