返回顶部
首页 > 资讯 > 后端开发 > Python >基于线程的wait和notify使用,生产消费案例
  • 738
分享到

基于线程的wait和notify使用,生产消费案例

2024-04-02 19:04:59 738人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录案例图解生产方逻辑图消费方逻辑图代码实现多个线程可以相互竞争,也可以互相协作完成一件事情。 Object的相关方法 Obje

多个线程可以相互竞争,也可以互相协作完成一件事情。

Object的相关方法

Object相关方法 描述
void wait() 让当前线程等待,如果没有被唤醒,就一直等待
void wait(long timeout) 让当前线程等待指定毫秒值,如果到了指定的毫秒值自动唤醒
void notify() 唤醒一个线程,唤醒的是当前对象下的一个线程
void notifyAll() 唤醒所有线程,唤醒的是当前对象锁下面的所有线程

这些方法一定要放在同步代码块中去使用,并且这些方法要通过锁对象去调用【***】

案例:

生产方每生产一个产品就需要等待(通知)消费方消费完产品后才能继续生产

消费方每消费一个产品就需要等待(通知)生产方去生产产品后才能继续消费。

案例图解

生产方逻辑图

在这里插入图片描述

消费方逻辑图

在这里插入图片描述

代码实现

【注意】

notify、wait写在同步代码块中,并且使用同一个对象(共有对象:仓库)进行操作。

this.cangku.wait() 和this.wait() 前一个使用的是仓库对象 ,后一个使用的是当前任务对象(使用后一个会造成死锁)


//仓库 - 唯一(锁对象,任何对象都可以,用共有对象做锁对象)
class CangKu { //当作 锁对象
    //定义一个变量体现数量
    public int productNum = 0;
}
//生产方和消费方共用一个仓库
//生产方
class ProductTask implements Runnable {
    private CangKu cangKu; //共用一个仓库不能自己创建,由外部传入
    public ProductTask(CangKu cangKu) { //通过构造函数初始化
        this.cangKu = cangKu;
    }
    @Override
    public void run() {
        while (true) {
            //通知notify与等待wait必须写在同步代码块中
            synchronized (this.cangKu) {//判断是否有锁可用,有就进入
                if (this.cangKu.productNum == 0) {
                    ++this.cangKu.productNum;   //生产数目+1
                    System.out.println("生产了一个产品,当前产品数目:" + this.cangKu.productNum);
                    //通知消费者,必须用同一个锁对象,不然会造成死锁
                    this.cangKu.notify();
                } else {
                    //当前还有存货不用生产,等待通知
                    try {
                        System.out.println("生产方等待中...");
                        this.cangKu.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }//end if
            }//end synchronized 出房间释放锁
        }
    }
}
//消费方
class ConsumerTask implements Runnable {
    private CangKu cangKu;
    public ConsumerTask(CangKu cangKu) {    //构造方法
        this.cangKu = cangKu;
    }
    @Override
    public void run() {
        while (true) {
            synchronized (this.cangKu) {
                //判断,仓库是否为0
                if (this.cangKu.productNum == 0) {
                    try {
                        System.out.println("消费方等待中...");
                        this.cangKu.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    //有货可以吃
                    -- this.cangKu.productNum ;
                    System.out.println("消费了一个产品,当前产品数目:" + this.cangKu.productNum);
                    //通知生产方生产产品
                    this.cangKu.notify();
                }//end if
            }//end synchronized
        }
    }
}
public class Wait_Notify_Demo {
    public static void main(String[] args) {
        //任务对象(生产方和消费方共用一个仓库)
        CangKu cangKu = new CangKu();
        ProductTask productTask = new ProductTask(cangKu);
        ConsumerTask consumerTask = new ConsumerTask(cangKu);
        //定义线程(用Executors线程池)
        ExecutorService pool = Executors.newFixedThreadPool(2);
        pool.submit(productTask);   //生产
        pool.submit(consumerTask);  //消费
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 基于线程的wait和notify使用,生产消费案例

本文链接: https://lsjlt.com/news/133112.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于线程的wait和notify使用,生产消费案例
    目录案例图解生产方逻辑图消费方逻辑图代码实现多个线程可以相互竞争,也可以互相协作完成一件事情。 Object的相关方法 Obje...
    99+
    2024-04-02
  • java中的wait()和notify()方法实现生产者消费者模式实例
    这篇文章主要介绍“java中的wait()和notify()方法实现生产者消费者模式实例”,在日常操作中,相信很多人在java中的wait()和notify()方法实现生产者消费者模式实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-20
  • Java多线程:生产者与消费者案例
    目录前言工具知识点设计思路具体步骤总结前言 想象一下生活中哪些是和线程沾边的?饭店炒菜就是一个很好的例子 首先客人要吃菜,前提是厨师要炒好,也就是说,厨师不炒好的话客人是没有饭菜的。...
    99+
    2024-04-02
  • Java线程通信中关于生产者与消费者案例分析
    相关方法: wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。 notify():一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就唤醒...
    99+
    2024-04-02
  • Java多线程中的生产者与消费者案例讲解
    这篇文章主要讲解了“Java多线程中的生产者与消费者案例讲解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程中的生产者与消费者案例讲解”吧!目录前言工具知识点设计思路具体步骤总结...
    99+
    2023-06-20
  • Java使用wait和notify实现线程之间的通信
    目录一. 为什么需要线程通信二. wait和notify方法1. wait()方法2. notify()方法 3. notifyAll()方法三. 使用wait和notif...
    99+
    2024-04-02
  • Java中怎么使用wait和notify实现线程间的通信
    这篇“Java中怎么使用wait和notify实现线程间的通信”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中怎么使...
    99+
    2023-06-30
  • Java多线程怎么才能协调好生产和消费的关系
    这篇文章主要介绍“Java多线程怎么才能协调好生产和消费的关系”,在日常操作中,相信很多人在Java多线程怎么才能协调好生产和消费的关系问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java多线程怎么才能协调...
    99+
    2023-06-17
  • Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析
    Queue是什么队列,是一种数据结构。除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的。无论使用哪种排序方式,队列的头都是调用remove()或poll()移除元素的。在FIFO队列中,所有新元素都插...
    99+
    2023-05-30
    java 多线程 生产消费者
  • JAVA项目中的生产者消费者如何利用多线程实现
    今天就跟大家聊聊有关JAVA项目中的生产者消费者如何利用多线程实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JAVA多线程实现生产者消费者的实例详解Product.Javapac...
    99+
    2023-05-31
    java 多线程 ava
  • 使用 sarama 监控 Kafka 生产者和消费者的性能数据
    从现在开始,我们要努力学习啦!今天我给大家带来《使用 sarama 监控 Kafka 生产者和消费者的性能数据》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过...
    99+
    2024-04-04
  • Java多线程中不同条件下编写生产消费者模型的示例分析
    这篇文章主要为大家展示了“Java多线程中不同条件下编写生产消费者模型的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java多线程中不同条件下编写生产消费者模型的示例分析”这篇文章吧。...
    99+
    2023-05-30
    java
  • 理解生产者消费者模型及在Python编程中的运用实例
    什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产 生数据的模块,就形象地称为生产者...
    99+
    2022-06-04
    生产者 实例 模型
  • Python爬虫程序中使用生产者与消费者模式时进程过早退出的问题
    之前写爬虫程序的时候,采用生产者和消费者的模式,利用Queue作为生产者进程和消费者进程之间的同步队列。 执行程序时,总是秒退,加了断点也无法中断,加打印也无法输出,我知道肯定是进程...
    99+
    2023-01-06
    Python生产者与消费者模式进程早退 Python 进程早退
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作