IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java多线程 04:wait方法 和 notify方法(生产者和消费者模式) -> 正文阅读

[Java知识库]Java多线程 04:wait方法 和 notify方法(生产者和消费者模式)

一、关于Object类中的 wait 和 notify 方法

  1. wait 和 notify 方法不是线程对象的方法,是java中任何一个java对象都拥有的方法,因为这个是Object类中自带的方法。
  2. wait() 和 notify() 方法的作用:

    Object o = new Object();

    • o.wait(): 让正在o对象上活动的线程进入无期限等待状态,直到被唤醒为止。
    • o.notify(): 唤醒正在o对象上等待的线程。
      —— notifyAll()方法:这个方法是唤醒o对象上处于等待的所有线程。
      在这里插入图片描述

二、生产者和消费者模式

  1. 使用 wait() 和 notify() 方法实现“生产者和消费者模式”。
    • 什么是“生产者和消费者模式”?
      —— 生产线程负责生产,消费线程负责消费。生产线程和消费线程要达到均衡。
      注:这是一种特殊的业务需求,在这种特殊的情况下需要使用到 wait() 和 notify() 方法。
    • wait和notify方法不是线程对象的方法,是普通java对象都有的方法。
    • wait方法和notify方法建立在线程同步的基础之上。因为多线程要同时操作同一个对象。有线程安全问题。
    • wait 和 notify 方法的作用:
      • wait方法作用: o.wait()让正在o对象上活动的线程t进入等待状态,并且释放掉t线程之前占有的o对象的锁。
      • notify方法作用: o.notify()让正在o对象上等待的线程唤醒,只是通知,不会释放o对象上之前占有的锁。
        在这里插入图片描述
  2. 模拟生产者和消费者模式
    /*
    模拟生产者和消费者模式
    假设List集合是仓库,只能存储1个数据
    做到生产一个数据消费一个数据
     */
    public class ThreadTest07 {
        public static void main(String[] args) {
            //创建一个仓库
            List list = new ArrayList();
            //生产线程
            Thread t1 = new Thread(new Produce(list),"生产者线程");
            //消费线程
            Thread t2 = new Thread(new Consume(list),"消费者线程");
            //启动线程
            t1.start();
            t2.start();
        }
    }
    
    class Produce implements Runnable {
        //仓库
        private List list;
    
        public Produce(List list) {
            this.list = list;
        }
    
        @Override
        public void run() {
            //一直生产
            while (true) {
                synchronized (list) {
                    if (list.size() > 0) {//仓库满了
                        try {
    //                        list.notifyAll();//唤醒
                            list.wait();// 当前线程进入等待状态,并且释放Produce之前占有的list集合的锁。
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //如果能运行到此处,证明仓库未满,开始生产
                    Object o = new Object();
                    list.add(o);
                    System.out.println(Thread.currentThread().getName() + "--->" + o);
                    //唤醒
                    list.notifyAll();//唤醒
                }
            }
        }
    }
    
    class Consume implements Runnable {
        //仓库
        private List list;
    
        public Consume(List list) {
            this.list = list;
        }
        @Override
        public void run() {
            //一直消费
            while (true) {
                synchronized (list) {
                    if (list.size() == 0) {//仓库空了
                        try {
    //                        list.notifyAll();//唤醒
                            list.wait();// 当前线程进入等待状态,并且释放Consume之前占有的list集合的锁。
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //如果能运行到此处,证明仓库已满,开始消费
                    Object o = list.remove(0);
                    System.out.println(Thread.currentThread().getName() + "--->" + o);
                    //唤醒
                    list.notifyAll();//唤醒
                }
            }
        }
    }
    
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:08:21  更:2021-12-15 18:09:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:52:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码