引言

  生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:

生产者消费者图

  存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。

JAVA解决线程模型的三种方式

  1、wait()和notify()

import java.util.LinkedList;public class ProducerConsumer {private LinkedList<Object> storeHouse = new LinkedList<Object>();private int MAX = 10;public ProducerConsumer() {}public void start() {new Producer().start();new Comsumer().start();}class Producer extends Thread {public void run() {while (true) {synchronized (storeHouse) {try {while (storeHouse.size() == MAX) {System.out.println("storeHouse is full , please wait");storeHouse.wait();}Object newOb = new Object();if (storeHouse.add(newOb)) {System.out.println("Producer put a Object to storeHouse");Thread.sleep((long) (Math.random() * 3000));storeHouse.notify();}} catch (InterruptedException ie) {System.out.println("producer is interrupted!");}}}}}class Comsumer extends Thread {public void run() {while (true) {synchronized (storeHouse) {try {while (storeHouse.size() == 0) {System.out.println("storeHouse is empty , please wait");storeHouse.wait();}storeHouse.removeLast();System.out.println("Comsumer get  a Object from storeHouse");Thread.sleep((long) (Math.random() * 3000));storeHouse.notify();} catch (InterruptedException ie) {System.out.println("Consumer is interrupted");}}}}}public static void main(String[] args) throws Exception {ProducerConsumer pc = new ProducerConsumer();pc.start();}
}

2、await()和signal(),即线程锁的方式

package sort;import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class ProducerConsumer {private LinkedList<Object> myList = new LinkedList<Object>();private int MAX = 10;private final Lock lock = new ReentrantLock();private final Condition full = lock.newCondition();private final Condition empty = lock.newCondition();public ProducerConsumer() {}public void start() {new Producer().start();new Consumer().start();}public static void main(String[] args) throws Exception {ProducerConsumer s2 = new ProducerConsumer();s2.start();}class Producer extends Thread {public void run() {while (true) {lock.lock();try {while (myList.size() == MAX) {System.out.println("warning: it's full!");full.await();}Object o = new Object();if (myList.add(o)) {System.out.println("Producer: " + o);empty.signal();}} catch (InterruptedException ie) {System.out.println("producer is interrupted!");} finally {lock.unlock();}}}}class Consumer extends Thread {public void run() {while (true) {lock.lock();try {while (myList.size() == 0) {System.out.println("warning: it's empty!");empty.await();}Object o = myList.removeLast();System.out.println("Consumer: " + o);full.signal();} catch (InterruptedException ie) {System.out.println("consumer is interrupted!");} finally {lock.unlock();}}}}}

3、阻塞队列的方式
import java.util.concurrent.*;

public class ProducerConsumer {
    // 建立一个阻塞队列
    private LinkedBlockingQueue<Object> queue = new LinkedBlockingQueue<Object>(10);

public ProducerConsumer() {
    }

public void start() {
        new Producer().start();
        new Consumer().start();
    }

public static void main(String[] args) throws Exception {
        ProducerConsumer s3 = new ProducerConsumer();
        s3.start();
    }

class Producer extends Thread {
        public void run() {
            while (true) {
                try {
                    Object o = new Object();
                    // 取出一个对象
                    queue.put(o);
                    System.out.println("Producer: " + o);
                } catch (InterruptedException e) {
                    System.out.println("producer is interrupted!");
                }
                // }
            }
        }
    }

class Consumer extends Thread {
        public void run() {
            while (true) {
                try {
                    // 取出一个对象
                    Object o = queue.take();
                    System.out.println("Consumer: " + o);
                } catch (InterruptedException e) {
                    System.out.println("producer is interrupted!");
                }
                // }
            }
        }
    }

}

结论

三种方式原理一致,都是对独占空间加锁,阻塞和唤醒线程,第一种方式比较传统,第三种方式最简单,只需存储和取用,线程同步的操作交由LinkedBlockingQueue全权处理。

java实现生产者消费者问题相关推荐

  1. Java多线程-生产者消费者问题(多个消费者多个生产者)

    Java多线程-生产者消费者问题(多个消费者多个生产者) public class ConsumerProcuderDemo {public static void main(String[] arg ...

  2. 【Java】生产者消费者模型

    [Java]生产者消费者模型 0x1 前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间 ...

  3. java实现生产者消费者模式

    一: 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直 ...

  4. 【Java】生产者消费者模式的三种实现

    原文地址:https://blog.csdn.net/u010983881/article/details/78554671 前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内 ...

  5. 【Java】生产者消费者模式的实现

    前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力.这个 ...

  6. java实现生产者消费者问题(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  7. 基于JAVA的生产者消费者问题

    一.需求分析 为了更好地理解进程同步的机制和过程,决定设计实现生产者消费者问题的解决,以实现进程的同步控制. 题目描述:有n个生产者在生产产品,这些产品将提供给m个消费者去消费,为了使生产者和消费者能 ...

  8. Java多线程生产者消费者调度实现

    生产者消费者模型是多线程中最常见的模型,有着广泛的应用.其主要目的是实现一种动态的平衡,让生产者消费者和谐共处,获得最大化的执行效率. 所说的动态平衡其实就是生产者与消费者协作控制仓储,让消费者不至于 ...

  9. java 生产者消费者_基于JAVA的生产者消费者问题

    一.需求分析 为了更好地理解进程同步的机制和过程,决定设计实现生产者消费者问题的解决,以实现进程的同步控制. 题目描述:有n个生产者在生产产品,这些产品将提供给m个消费者去消费,为了使生产者和消费者能 ...

  10. 用Java解决生产者-消费者问题

    当我们尝试多线程编程时,生产者-消费者问题是最常见的问题之一. 尽管不像多线程编程中的其他一些问题那样具有挑战性,但是错误地实现此问题可能会造成应用程序混乱. 生产的物品将不使用,开始的物品将被跳过, ...

最新文章

  1. 河南城建学院linux期末试题,河南城建学院09-10(上)期末试题.ppt
  2. NASA指定首批9名宇航员,参与波音和马斯克商业载人航天
  3. 网络:TIME-WAIT
  4. java 中调用docker_如何通过Java程序执行docker命令
  5. 绘图和可视化---matplotlib包的学习
  6. mac 下使用wireshark监听网络上的数据
  7. Microsoft Visual Studio Code
  8. flask mysql 配置文件_Flask配置文件
  9. 关于golden gate director client的一点点使用总结
  10. 峰情万种_Enhancement of Peak Visual
  11. RunLoop 原理和核心机制
  12. mybatis 多租户saas_SaaS 微服务脚手架
  13. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_16-CMS服务端工程搭建-导入CMS数据库...
  14. 自己的域名邮箱用GMAIL:申请注册GMAIL的免费企业邮箱
  15. usb调试助手_【小白教程】如何使用米卓同屏助手?
  16. python gif转jpg_PIL-将GIF帧转换为JPG
  17. okr与项目管理区别?
  18. 性能测试-性能测试结果分析
  19. 京东实习笔试——站队
  20. 解决win10下高分屏的字体显示模糊问题

热门文章

  1. 小一爬取了 14455 个已发行基金,到底能分析点啥出来?
  2. “打击式教育”盛行?数据分析剖析“中式父母”的“打压式教育”
  3. 统一配置中心选型对比
  4. vue window.location.href 返回页面不刷新_前端框架vue中的keep-alive总结实践
  5. 效果直逼flash的Div+Css+Js菜单
  6. 真会省钱!苹果iPhone SE3首拆:电池、内存容量揭晓、基带属实缩水
  7. CINNO:2025年全球折叠屏智能手机销量有望超5700万部
  8. 三星Galaxy S22系列发布会准确时间曝光:2月9日正式揭晓
  9. 6999元!红魔6S Pro推出战地迷彩主题限定套装:11月1日正式开售
  10. 外媒:特斯拉申请新商标 寻求进入餐饮业