一个简单的生产者消费者

使用ReentrantLock以及Condition实现的生产者消费者,也是java 1.5之后推荐写法,不再使用object类的notify()以及wait()方法。直接上代码:

public class Stroge {

    private final int MAX_SIZE = 100;

    private LinkedList<Object> list = new LinkedList<>();

    private Lock lock = new ReentrantLock();
    private Condition notFull = lock.newCondition();
    private Condition notEmpty = lock.newCondition();

    public void produce(int num) {
        lock.lock();
        try {
            while (list.size() + num > MAX_SIZE) {
                System.out.println("当前size:" + list.size() + ",不能再创建" + num + "个产品,await");
                try {
                    notFull.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int i = 0; i < num; i++) {
                list.add(new Object());
            }
            System.out.println(num + "个产品创建完成,当前size:" + list.size());
            notEmpty.signalAll();
        } finally {
            lock.unlock();
        }
    }

    public void consume(int num) {
        lock.lock();
        try {
            while (list.size() < num) {
                System.out.println("当前size:" + list.size() + ",不能再消费" + num + "个产品,await");
                try {
                    notEmpty.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            for (int i = 0; i < num; i++) {
                list.remove();
            }
            System.out.println(num + "个产品消费完成,当前size:" + list.size());
            notFull.signalAll();
        } finally {
            lock.unlock();
        }
    }
}
//生产者类
class Producter extends Thread {
    Stroge sto = null;
    private int num;

    public Producter(Stroge sto) {
        this.sto = sto;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public void product(int num) {
        sto.produce(num);
    }

    @Override
    public void run() {
        product(num);
    }
}
//消费者类
class Consumer extends Thread {
    Stroge sto = null;
    private int num;

    public Consumer(Stroge sto) {
        this.sto = sto;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public void consume(int num) {
        sto.consume(num);
    }

    @Override
    public void run() {
        consume(num);
    }
}

测试类:

public class Testprosum {

    public static void main(String[] args) {
        Stroge sto = new Stroge();

        Producter p1 = new Producter(sto);

        Producter p2 = new Producter(sto);
        Producter p3 = new Producter(sto);
        Producter p4 = new Producter(sto);
        Producter p5 = new Producter(sto);

        Consumer c1 = new Consumer(sto);
        Consumer c2 = new Consumer(sto);
        Consumer c3 = new Consumer(sto);
        Consumer c4 = new Consumer(sto);
        Consumer c5 = new Consumer(sto);

        p1.setNum(10);
        p2.setNum(20);
        p3.setNum(30);
        p4.setNum(40);
        p5.setNum(50);

        c1.setNum(10);
        c2.setNum(20);
        c3.setNum(30);
        c4.setNum(40);
        c5.setNum(50);

        p1.start();
        p2.start();
        p3.start();
        p4.start();
        p5.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        c1.start();
        c2.start();
        c3.start();
        c4.start();
        c5.start();
    }
}

ReentrantLock需要注意try{}finally{lock.unlock();}
OVER

时间: 2024-09-25 16:05:19

一个简单的生产者消费者的相关文章

Lock、Condition实现简单的生产者消费者模式示例_java

复制代码 代码如下: package condition; import java.util.ArrayList;import java.util.List;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * 利用Lock.Condition实现生产者消费者模式 * @aut

用Python多线程实现生产者消费者模式

什么是生产者消费者模式 在软件开发的过程中,经常碰到这样的场景: 某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数.线程.进程等).产生数据的模块称为生产者,而处理数据的模块称为消费者.在生产者与消费者之间的缓冲区称之为仓库.生产者负责往仓库运输商品,而消费者负责从仓库里取出商品,这就构成了生产者消费者模式. 结构图如下: 为了大家容易理解,我们举一个寄信的例子.假设你要寄一封信,大致过程如下: 你把信写好--相当于生产者生产数据 你把信放入邮箱--相当于生产者把数据放

聊聊并发:生产者消费者模式

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这个问题于是引入了生产者和消费者模式. 什么是生产者消费者模式 生产者

聊聊并发(十)生产者消费者模式

本文首发于InfoQ   作者:方腾飞  校对:张龙 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这种生产消费能力

一个java生产者消费者代码的问题

问题描述 一个生产者消费者的代码,使用lock和condition实现.import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;//生产/消费者模式public class Basket {Lock lock = new ReentrantLock();// 产生Condition对象Cond

并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对原生态的POSIX 的mutex,cond的生成者,消费者的实现,我们可以再次体会boost带给我们的便利. 1. 什么是互斥量        互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁.对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将

[Java] 多线程下生产者消费者问题的五种同步方法实现

版权声明:请尊重个人劳动成果,转载注明出处,谢谢! 目录(?)[+] 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.    生产者消费者模式的优点 - 解耦 - 支持并发 - 支持忙闲不均 解决方法可分为两类:   (1)用信号量和锁机制实现生产者和消费者之间的同步:    - wait() / notify()方法  - await() / signal()方法  - BlockingQueue阻塞队列方法  - Semaphore方法    (2)在生产者和消费者之间建立一

Linux线程编程之生产者消费者问题

前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一  顺序表循环队列 1.1 顺序循环队列定义 队列是一种运算受限的先进先出线性表,仅允许在队尾插入(入队),在队首删除(出队).新元素入队后成为新的队尾元素,元素出队后其后继元素就成为队首元素. 队列的顺序存储结构使用一个数组和两个整型变量实现,其结构如下: 1 struct Queue{ 2     ElemType el

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait.notify 和 notifyAll 来实现线程间的通信..举个例子,如果你的Java程序中有两个线程--即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空).相应的,消费者可以通知生产者可以开始生成更多的数据,因为当它消耗掉某些数据后缓冲区不再