1: 生产者和消费者的问题,生产者生产产品到缓冲区,消费者从缓冲区中取,缓冲区如果满了,生产者就不能再生产,如果缓冲区为空,消费者则不能消费
1: 多线程并发执行,在生产产品和消费的时候可能是多个线程并发,所以必须加上锁,不然缓冲区的产生并发问题
2:当缓冲区满或者缓冲区空洞时候要阻塞,直到符合条件 唤醒
1:第一种实现, wait(), notifyAll();
public class ProductConsumer2 { private final int MAX_SIZE=100; private final LinkedList<Object> list=new LinkedList<Object>(); public void product(int num) throws InterruptedException { synchronized(list) { if(list.size() + num > MAX_SIZE) { // 剩余容量不足 线程阻塞 list.wait(); } for(int i=0; i < num; i++) { System.out.println("thread name " + Thread.currentThread().getName() + " product"); list.add(new Object()); } list.notifyAll(); } } public void cosume(int num) throws InterruptedException { synchronized(list) { if(list.size() < num) { list.wait(); } for(int i=0; i < num; i++) { System.out.println("thread name " + Thread.currentThread().getName() + " remove"); list.remove(); } list.notifyAll(); } } class ProductThread implements Runnable { public void run() { try { product(10); } catch(InterruptedException e) { System.out.println("中断"); } } } class CosumeThread implements Runnable { public void run() { try { cosume(10); } catch(InterruptedException e) { System.out.println("中断"); } } } public static void main(String... args) { ProductConsumer2 pc=new ProductConsumer2(); for(int i=0; i < 10; i++) { new Thread(pc.new ProductThread()).start(); } for(int i=0; i < 10; i++) { new Thread(pc.new CosumeThread()).start(); } } }
第2种,ReentrantLock 和Condition实现阻塞队列
/** * 生产者和消费者 Condition实现 * @author ljq */ public class ProductQueue<T> { private final T[] items; private final Lock lock=new (); private Condition notFull=lock.newCondition(); private Condition notEmpty=lock.newCondition(); private int head, tail, count; @SuppressWarnings("unchecked") public ProductQueue(int maxSize) { this.items=(T[])new Object[maxSize]; } public void put(T t) throws InterruptedException { lock.lock(); try { while(count == getCapacity()) { // 数组已经满了 notFull.await(); } items[tail]=t; if(++tail == getCapacity()) { tail=0; } count++; notEmpty.signalAll(); } finally { lock.unlock(); } } public T take() throws InterruptedException { lock.lock(); try { while(count == 0) { notEmpty.await(); } T t=items[head]; items[head]=null; if(++head == getCapacity()) { head=0; } count--; notFull.signalAll(); return t; } finally { lock.unlock(); } } private int getCapacity() { return items.length; } public int size() { lock.lock(); try { return count; } finally { lock.unlock(); } } }
第三种 juc中 LinkedBlockingQueue
public class ProductConsumer { private final int MAX_SIZE=100; private LinkedBlockingQueue<Object> queue=new LinkedBlockingQueue<Object>(MAX_SIZE); public void product(int num) throws InterruptedException { if(queue.size() == MAX_SIZE) { System.out.println("已经满了"); return; } for(int i=0; i < num; i++) { queue.put(new Object()); } } public void Consume(int num) throws InterruptedException { if(queue.size() == 0) { System.out.println("队列为空"); return; } for(int i=0; i < num; i++) { queue.take(); } } }
4: 还有一种用Semaphore信号量实现
相关推荐
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
java生产者消费者模型
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
基本满足操作系统课上要求,java实现的生产者消费者模型。
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
java 多线程生产者消费者模型demo
理解java中生产者消费者模型,以及如何利用双缓冲机制来解决同步与死锁问题。
Java实现生产者消费者模型 生产者消费者模型,是一般面试题都会考的,下面介绍使用ReetrantLock实现 生产者消费者模型。 定义一个ReentrantLock锁,同时new出两个condition,一个控制队满,一个 控制队空 //生产者 ...
java多线程_消费者与生产者模型
自己用Java写的简单生产者与消费者模型
以车库为例子,一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。 根据进程同步机制,编写一个解决上述问题的可视化程序,可显示缓冲池状态、放数据、取数据等...
利用线程间的通信主要是因为当多个线程同时对一个对象进行访问的时候,多个线程之间是一个协助的关系,举个例子就是今天要说的生产这和消费者模型。
java 课程设计 生产者消费者图形界面模拟 swing模拟单个生产者单个消费者 多个生产者多个消费者
操作系统,生产者消费者问题和先来先服务算法,java语言编写。
使用Java完成的生产者消费者模型,适合初学者对线程进行深入理解使用,本代码仅用于学习交流,祝各位学习顺利!
所谓的生产者消费者模型,是通过一个容器来解决生产者和消费者的强耦合问题。通俗的讲,就是生产者在不断的生产,消费者也在不断的消费,可是消费者消费的产品是生产者生产的,这就必然存在一个中间容器,我们可以把...
主要介绍了Java实现简易生产者消费者模型过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本课程设计的目的是通过设计一个消费者进程与生产者进程的同步模拟系统,认识进程间的同步机制生产者消费者问题是一个著名的进程同步问题。 (1) 有一群生产者进程在生产消息, 并将消息提供给消费者进程去消费。为...