04.Java 多线程 - 生产者&消费者


基本概念

在Java的 Object 类中有三个 fina l的方法允许线程之间进行资源对象锁的通信。分别是:waitnotifynotifyAll

调用这些方法的当前线程必须拥有此对象的监视器(即锁),否则将会报 java.lang.IllegalMonitorStateException exception 异常。


原理分析

首先来看 Object 的结构:

这里写图片描述


1.wait

Object的 wait 方法有三个重载方法:

  • wait() 是无限期(一直)等待,直到其它线程调用 notify 或 notifyAll 方法唤醒当前的线程;

  • wait(long timeout) 和wait(long timeout, int nanos) 允许传入 当前线程在被唤醒之前需要等待的时间,timeout为毫秒数,nanos为纳秒数。


2.notify

notify 方法只唤醒一个等待(对象的)线程并使该线程开始执行。

所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作系统对多线程管理的实现。


3.notifyAll

notifyAll 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现。


实例探究

下面来讲讲 java 多线程的典型例子 - 生产者与消费者。它们就是依靠 wait、notify/notifyAll 来实现的。

在下面的代码中,定义了三个类:Depot (仓库),Producer (生产者),Customer (消费者)。

  • Depot ,定义了生产/消费两个动作,同一时间只能执行一个动作。并且规定当仓库未满仓时,可以生产物品,满仓后停止该动作;当仓库存在物品时,可以消费物品,空仓后停止该动作。
public class Depot {
    // 仓库容量
    private int capacity;

    // 仓库实际物品数量
    private int size;

    public Depot(int capacity) {
        this.capacity = capacity;
        this.size = 0;
    }

    // 制造商品
    public synchronized void produce(int val) throws InterruptedException {

        System.out.println("制造商品前,当前仓库里有物品:" + size);

        // 仓库未满时
        while (size < capacity) {
            // 实际生产的物品数量(不能超出容量)
            int num = (size + val) > capacity ? capacity - size : val;
            //添加进仓库
            size += num;
            System.out.println("实际生产了物品:" + num + ",当前仓库里有物品:" + size);
            notify();
        }
        wait();
    }

    // 消费商品
    public synchronized void consume(int val) throws InterruptedException {
        // 仓库存在物品时可以消费
        while (size > 0) {
            int num = size > val ? val : size;
            size -= num;
            System.out.println("实际消费了物品:" + num + ",当前仓库里有物品:" + size);
            notify();
        }
        wait();
    }
}

  • Producer ,调用 Depot 的生产动作,每次生产 7 件物品
class Producer implements Runnable {
    private Depot depot;
    private int val;

    public Producer(Depot depot,int val) {
        this.depot = depot;
        this.val = val;
    }

    public void run() {
        try {
            depot.produce(val);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  • Customer ,调用 Depot 的消费动作,每次生产 6 件物品
public class Customer implements Runnable {
    private Depot depot;
    private int val;

    public Customer(Depot depot,int val) {
        this.depot = depot;
        this.val = val;
    }

    public void run() {
        try {
            depot.consume(val);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  • 调用过程
Depot depot = new Depot(100);
Producer pro = new Producer(depot,7);
Customer cus = new Customer(depot, 6);
Thread t1 = new Thread(pro);
Thread t2  = new Thread(cus);
t1.start();
t2.start();

  • 输出结果
//开始生产,注意最后一次生产

制造商品前,当前仓库里有物品:0
实际生产了物品:7,当前仓库里有物品:7
实际生产了物品:7,当前仓库里有物品:14
实际生产了物品:7,当前仓库里有物品:21
实际生产了物品:7,当前仓库里有物品:28
实际生产了物品:7,当前仓库里有物品:35
实际生产了物品:7,当前仓库里有物品:42
实际生产了物品:7,当前仓库里有物品:49
实际生产了物品:7,当前仓库里有物品:56
实际生产了物品:7,当前仓库里有物品:63
实际生产了物品:7,当前仓库里有物品:70
实际生产了物品:7,当前仓库里有物品:77
实际生产了物品:7,当前仓库里有物品:84
实际生产了物品:7,当前仓库里有物品:91
实际生产了物品:7,当前仓库里有物品:98
实际生产了物品:2,当前仓库里有物品:100

//停止生产,开始消费。注意最后一次消费

实际消费了物品:6,当前仓库里有物品:94
实际消费了物品:6,当前仓库里有物品:88
实际消费了物品:6,当前仓库里有物品:82
实际消费了物品:6,当前仓库里有物品:76
实际消费了物品:6,当前仓库里有物品:70
实际消费了物品:6,当前仓库里有物品:64
实际消费了物品:6,当前仓库里有物品:58
实际消费了物品:6,当前仓库里有物品:52
实际消费了物品:6,当前仓库里有物品:46
实际消费了物品:6,当前仓库里有物品:40
实际消费了物品:6,当前仓库里有物品:34
实际消费了物品:6,当前仓库里有物品:28
实际消费了物品:6,当前仓库里有物品:22
实际消费了物品:6,当前仓库里有物品:16
实际消费了物品:6,当前仓库里有物品:10
实际消费了物品:6,当前仓库里有物品:4
实际消费了物品:4,当前仓库里有物品:0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oxf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值