`
iluoxuan
  • 浏览: 579795 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java生产者和消费者模型三种实现

 
阅读更多

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多线程实现生产者和消费者

    `BlockingQueue`接口提供了线程安全的队列,自动处理了等待和唤醒操作,是实现生产者-消费者模型的一种高效方式。 4. **条件变量**:`wait()`, `notify()`和`notifyAll()`是基于条件变量的,它们可以使得线程在特定...

    java实现多线程经典模型生产者消费

    java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...

    Java多线程实现生产者消费者

    首先,我们要理解生产者-消费者模型的基本概念。在这个模型中,“生产者”线程负责生成产品并放入“仓库”,而“消费者”线程则负责从仓库中取出产品并进行消费。为了保证数据的一致性和避免竞态条件(多个线程同时...

    生产者与消费者 java实现

    本主题将深入探讨生产者与消费者模型的Java实现。 生产者与消费者问题的核心是有一个共享资源(例如,一个缓冲区),生产者不断地生产产品并放入缓冲区,而消费者则从缓冲区取出产品进行消费。关键在于确保生产者...

    java实现生产者消费者

    在Java编程中,"生产者消费者"模式是一种典型的多线程问题解决模型,它通过共享资源来协调生产者和消费者之间的操作。这个模式的核心在于如何有效地管理资源的生产和消费,以避免生产过快导致资源浪费,或者消费者...

    Java 线程间通信,生产者与消费者模型

    使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)

    java多线程经典模型生产者消费者

    java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...

    java中生产者和消费者模型

    Java中的生产者-消费者模型是一种经典的多线程同步问题,它涉及到线程间的协作与资源管理。在这个模型中,一个线程(生产者)负责生成数据,而另一个线程(消费者)负责处理这些数据。为了实现线程间的同步,Java...

    生产者 消费者 进程 可视化 java

    在Java编程中,"生产者-消费者"模型是一种常见的多线程问题,它涉及到进程间的同步与通信。在这个模型中,生产者线程负责生成数据并放入缓冲区,而消费者线程则负责从缓冲区取出数据进行处理。这里的"车库"例子就是...

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

    ### Java生产者与消费者模型详解 #### 实验背景与目的 在并发编程中,生产者-消费者模式是一种经典的解决同步问题的设计模式。本实验旨在通过实际编程操作,深入理解Java中生产者与消费者模型的工作机制及其同步...

    操作系统:多线程处理生产者消费者,java实现

    基本满足操作系统课上要求,java实现的生产者消费者模型。

    java生产者消费者问题

    在CSDN.NET博客文章中,作者详细讨论了如何使用线程同步和等待的应用来解决此问题,并提供了示例代码ProducerConsumer.java和ProducerConsumerx.java,这些代码可以帮助读者更好地理解和实现生产者消费者模型。...

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    Java 生产者消费者模式

    在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...

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

    这个库提供了多种工具类,如Semaphore(信号量)、BlockingQueue(阻塞队列)和Condition(条件变量),这些都可以用来实现生产者-消费者模型。 1. **BlockingQueue**: 阻塞队列是一种特殊的队列,它具有线程安全的...

    java 多线程生产者消费者模型demo

    Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...

    自己用Java写的简单生产者与消费者模型

    在Java编程中,生产者-消费者模型是一种经典的多线程问题解决方案,用于处理并发操作中的数据共享和资源管理。这个模型通常由四个主要组件构成:生产者、消费者、存储(或缓冲区)以及可能的市场规则。根据提供的...

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    操作系统生产者与消费者问题Java简单模拟实现

    例如,`BlockingQueue`接口提供了线程安全的队列,它可以自然地应用于生产者-消费者模型。`BlockingQueue`的`put()`方法用于生产者添加元素,如果队列已满,它会阻塞生产者线程,直到有空间可用。同样,`take()`方法...

Global site tag (gtag.js) - Google Analytics