第十五章阻碍队列基本使用与等待唤醒机制

目录

1.阻碍队列的基本使用

        1.1阻碍队列继承结构:

        1.2常见BlockingQueue:

        1.3BlockingQueue的核心方法:

        1.4代码演示:

        1.5注意

2.阻碍队列实现等待唤醒机制

        2.1案例需求

        2.2代码实现

        2.3注意


1.阻碍队列的基本使用

        1.1阻碍队列继承结构:

        1.2常见BlockingQueue:

                ArrayBlockingQueue: 底层是数组,有界

                LinkedBlockingQueue: 底层是链表,无界.但不是真正的无界,最大为int的最大值

        1.3BlockingQueue的核心方法:

                put(E e): 将参数放入队列,如果放不进去会阻塞

                take(): 取出第一个数据,取不到会阻塞

        1.4代码演示:

public class Demo02 {
    public static void main(String[] args) throws Exception {
        // 创建阻塞队列的对象,容量为 1
        ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<>(1);

        // 存储元素
        arrayBlockingQueue.put("汉堡包");

        // 取元素
        System.out.println(arrayBlockingQueue.take());
        System.out.println(arrayBlockingQueue.take()); // 取不到会阻塞

        System.out.println("程序结束了");
    }
}

        1.5注意

                put()与take()内部进行上锁解锁

2.阻碍队列实现等待唤醒机制

        2.1案例需求

                生产者类(Cooker):实现Runnable接口,重写run()方法,设置线程任务

                        1.构造方法中接收一个阻塞队列对象

                        2.在run方法中循环向阻塞队列中添加包子

                        3.打印添加结果

                消费者类(Foodie):实现Runnable接口,重写run()方法,设置线程任务

                        1.构造方法中接收一个阻塞队列对象

                        2.在run方法中循环获取阻塞队列中的包子

                        3.打印获取结果

                测试类(Demo):里面有main方法,main方法中的代码步骤如下

                        创建阻塞队列对象

                        创建生产者线程和消费者线程对象,构造方法中传入阻塞队列对象

                        分别开启两个线程

        2.2代码实现

public class Cooker extends Thread {

    private ArrayBlockingQueue<String> bd;

    public Cooker(ArrayBlockingQueue<String> bd) {
        this.bd = bd;
    }
//    生产者步骤:
//            1,判断桌子上是否有汉堡包
//    如果有就等待,如果没有才生产。
//            2,把汉堡包放在桌子上。
//            3,叫醒等待的消费者开吃。

    @Override
    public void run() {
        while (true) {
            try {
                bd.put("汉堡包");
                System.out.println("厨师放入一个汉堡包");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Foodie extends Thread {
    private ArrayBlockingQueue<String> bd;

    public Foodie(ArrayBlockingQueue<String> bd) {
        this.bd = bd;
    }

    @Override
    public void run() {
//        1,判断桌子上是否有汉堡包。
//        2,如果没有就等待。
//        3,如果有就开吃
//        4,吃完之后,桌子上的汉堡包就没有了
//                叫醒等待的生产者继续生产
//        汉堡包的总数量减一

        //套路:
        //1. while(true)死循环
        //2. synchronized 锁,锁对象要唯一
        //3. 判断,共享数据是否结束. 结束
        //4. 判断,共享数据是否结束. 没有结束
        while (true) {
            try {
                String take = bd.take();
                System.out.println("吃货将" + take + "拿出来吃了");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

public class Demo {
    public static void main(String[] args) {
        ArrayBlockingQueue<String> bd = new ArrayBlockingQueue<>(1);

        Foodie f = new Foodie(bd);
        Cooker c = new Cooker(bd);

        f.start();
        c.start();
    }
}

        2.3注意

                因为输出语句在锁的外面,所以输出的时候可能会连续生产或者消耗,但是不影响内部数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zd08

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

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

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

打赏作者

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

抵扣说明:

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

余额充值