线程安全案例 --- 阻塞队列

小王学习录

  • 今日鸡汤
  • 阻塞队列
    • 什么是阻塞队列
      • 什么是生产者消费者模型
    • 阻塞队列的使用
    • 阻塞队列的代码实现
      • 1. 实现一个普通队列
      • 2. 在普通队列里加入阻塞特性
      • 完善阻塞队列
  • 消息队列

在数据结构的学习中我们知道队列是一种先进先出的数据结构, 但是存在一些特殊的队列, 比如: 优先级队列(Priority Queue), 阻塞队列和消息队列

今日鸡汤

一切伟大的行动和思想, 都有一个微不足道的开始

阻塞队列

什么是阻塞队列

相比于普通队列来说, 阻塞队列的特殊之处在于:

  1. 当队列中没有元素时执行出队的操作, 会使线程陷入阻塞. 直到另一个线程在队列里增加元素(使得队列不为空).
  2. 当队列已经满了还要往队列里增加元素时, 也会陷入阻塞

利用阻塞队列的特性, 可以实现一个生产者消费者模型

什么是生产者消费者模型

往队列里添加元素即为生产者, 从队列里拿出元素即为消费者, 使用生产者消费者模型有如下好处:

  1. 实现生产者和消费者间的解耦合
  2. 削峰填谷, 保证系统稳定性

阻塞队列的使用

我们知道在队列中, 入队是offer, 出队是poll. 而在阻塞队列中, 入队是put, 出队是take, 以下是阻塞队列的代码使用和运行结果

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;


public class ThreadDome1 {
   
    public static void main(String[] args) {
   
        BlockingQueue<Integer> blockingQueue= new LinkedBlockingQueue<>();
        Thread consumer = new Thread(()->{
   
            while(true){
   
                try {
   
                    int value = blockingQueue.take();
                    System.out.println("消费元素为:" + value);
                } catch (InterruptedException e) {
   
                    throw new RuntimeException(e);
                }
            }
        

你可能感兴趣的:(操作系统,java,开发语言,操作系统,数据结构,阻塞队列,消息队列,线程安全)