【数据结构 & JavaEE】—— 阻塞队列

文章目录:

一、阻塞队列

1. 阻塞队列简介

2. Java标准库提供的阻塞队列

二、实现阻塞队列

1. 先实现一个普通队列

2. 实现线程安全,加上阻塞功能

3. 继续优化,连续唤醒问题

阻塞队列完整代码

三、生产者消费者模型

1. 生产者消费者模型简介

2. 生产者消费者模型优点

3. 实现生产者消费者模型


一、阻塞队列

1. 阻塞队列简介

阻塞队列是基于普通队列做出的扩展,依旧符合“先进先出”的原则。

阻塞队列具有以下特性:

  • 如果针对一个已经满了的队列进行入队,此时入队操作就会阻塞,一直阻塞到队列不满(其他线程出队元素)之后

  • 如果针对一个已经空了的队列进行出队,此时出队操作就会阻塞,一直阻塞到队列不空(其他线程入队元素)之后

基于以上特性,阻塞队列是一种线程安全的数据结构

2. Java标准库提供的阻塞队列

:java.util.concurrent

接口:BlockingQueue

集合: ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue 

方法

        put:带有阻塞功能的入队列

        take:带有阻塞功能的出队列

        以及不带有阻塞功能的offer、poll、peek方法,但是并没有提供获取队首元素的方法

简单使用:

//Java标准库的阻塞队列

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ThreadDemo10 {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(100);
        queue.put("aaa");
        String elem = queue.take();
        System.out.println("elem = " + elem);
        elem = queue.take();
        System.out.println("elem = " + elem);
    }
}

运行结果:

这里只能输出一个“aaa”,是因为原本队列中只入队列了一个元素,在第一次出队后,队列为空,再次出队就会发生阻塞,直至队列有新的元素添加进去供其出队。

二、实现阻塞队列

1. 先实现一个普通队列

使用循环队列,用字符串数组elems来存储元素,不考虑泛型,存储元素类型为String

并实现最基本的入队和出队

//实现阻塞队列,不考虑泛型 存储类型为String
public class MyBlockingQueue {
    private String[] elems = null;
    private int head = 0;
    private int tail = 0;
    private int size = 0;


    public MyBlockingQueue(int capacity){
        elems = new String[capacity];
    }

    public void put(String elem){
        if(size >= elems.length){
            //队列满 需要阻塞
            return;
        }
        elems[tail] = elem;
        tail++;
        //写法一 好理解 + 高效  小胜一筹
        //条件跳转指令 高效
        //很少触发赋值操作
        if(tail >= elem.length()){
            tail = 0;
        }
        //
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值