首页 > 其他分享 >阻塞队列之 LinkedBlockingQueue

阻塞队列之 LinkedBlockingQueue

时间:2023-12-04 14:57:04浏览次数:29  
标签:Thread 队列 元素 LinkedBlockingQueue 阻塞 线程

LinkedBlockingQueue:Java多线程编程中的阻塞队列

在Java多线程编程中,LinkedBlockingQueue 是一个非常重要的类,它提供了一种用于在生产者和消费者之间进行数据传递的机制。LinkedBlockingQueue 广泛应用于各种场景,如线程池、任务队列等。本文将详细介绍 LinkedBlockingQueue 的原理和用法,并通过代码示例进行讲解。

1. LinkedBlockingQueue简介

LinkedBlockingQueue 是Java多线程编程中的一种阻塞队列。它基于链表节点实现,支持高并发线程之间的数据传递,同时保证了数据的有序性和一致性。LinkedBlockingQueue 提供了以下几种方法:

  • put(E e):将元素插入到队列中。如果队列已满,线程将会被阻塞,直到有消费者取走元素。
  • take():从队列中取出一个元素。如果队列为空,线程将会被阻塞,直到有生产者插入元素。
  • poll():从队列中取出一个元素,如果队列为空,返回null。
  • size():返回队列中的元素个数。
  • isEmpty():判断队列是否为空。
  • isFull():判断队列是否已满。

2. LinkedBlockingQueue原理

LinkedBlockingQueue 的实现基于链表结构,每个节点包含一个元素和一个指向下一个节点的引用。当生产者向队列插入元素时,如果队列未满,直接将元素插入到链表的末尾。如果队列已满,生产者线程将被阻塞,等待消费者线程来取走元素。当消费者从队列中取出元素时,如果队列为空,消费者线程将被阻塞,等待生产者线程来插入元素。

3. LinkedBlockingQueue用法

下面通过一个简单的代码示例来讲解 LinkedBlockingQueue 的用法:

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.Thread;
public class LinkedBlockingQueueExample {
    public static void main(String[] args) throws InterruptedException {
        LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);
        Thread producerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 15; i++) {
                        queue.put(i);
                        System.out.println("Produced: " + i);
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
        Thread consumerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 15; i++) {
                        int value = queue.take();
                        System.out.println("Consumed: " + value);
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
        producerThread.start();
        consumerThread.start();
    }
}

在这个示例中,我们创建了一个有界队列 LinkedBlockingQueue,容量为10。然后,我们创建了两个线程:一个生产者线程和一个消费者线程。生产者线程向队列中插入元素,而消费者线程从队列中取出元素。

标签:Thread,队列,元素,LinkedBlockingQueue,阻塞,线程
From: https://www.cnblogs.com/lovedaodao/p/17874904.html

相关文章

  • 消息队列入门 —— 以 Kafka 为例(一)
    消息队列入门——以Kafka为例(一)概述当我们的应用逐步变得庞大,各层应用之间调用关系越来越复杂,对系统的可用性以及可扩展性要求也越来越高。消息队列作为分布式系统架构中的一个关键中间件,提供了“消息传递”和“消息排队模型”,可以应用在系统解耦、异步处理、流量削峰等多个......
  • 栈和队列算法总结
    知识概览在数据结构中,栈和队列都属于线性表。栈是先进后出(FILO)的,队列是先进先出(FIFO)的。代码模板#include<iostream>usingnamespacestd;constintN=100010;//**********************栈intstk[N],tt;//插入stk[++tt]=x;//弹出tt--;//判断栈是否......
  • 四、Work Queues(工作队列)
    一、轮训分发消息1、抽取工具类2、启动两个工作线程2.1两个工作线程(消费者)2.2生产者3、启动一个发送线程4、结果展示二、消息应答1、概念2、自动应答3、消息应答的方法4、Multiple的解释5、消息自动重新入队6、消息手动应答代码......
  • RabbitMQ Java代码声明队列和交换机(方法一)
      交换机和队列的声明一般写在消费者模块里 代码示例:packagecom.itheima.config_RabbitMQ;importorg.springframework.amqp.core.*;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@Configuration......
  • FreeRTOS--队列集
    示例源码基于FreeRTOSV9.0.0队列集1.概述队列集的本质也是队列,只不过里面存放的是“队列句柄”。当任务需要及时读取多个队列时,可以使用队列集。它类似于posix的多路复用思想。可以将想要监听消息的队列放入队列集中,当其中有队列有数据达到时,队列集的接口会返回可读的队列句......
  • FreeRTOS--队列
    示例源码基于FreeRTOSV9.0.0队列1.概述FreeRTOS的队列,支持任务与任务间的通信,以及任务与中断间的通信。它是FreeRTOS系统中主要的任务间通信方式。队列内的消息,是通过拷贝方式传递,而非指针。队列除了基本的先进先出特性,也支持往队列首部写入数据。FreeRTOS基于队列进行扩......
  • 02-简单的C/S阻塞模型
    C/S阻塞模型是指客户端/服务器阻塞模型,它描述了一种基于阻塞的网络通信方式。在阻塞模型中,客户端发送请求给服务器,并等待服务器的响应。在等待服务器响应的过程中,客户端的操作会被阻塞,直到服务器响应返回或超时。服务器服务器基本流程如下:启动网络库创建服务器Socket绑定服......
  • RabbitMQ 接收队列的消息
     代码示例:注:要把这个类加上Component注解packagecom.itheima.amqp_listener;importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;@ComponentpublicclassMQListener{@RabbitListener(queues="simpl......
  • RabbitMQ 发送消息到队列(交换机不参与的那种)
    1.导包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2.在application.yml文件里编写配置信息spring:rabbitmq:host:192.168.88.130port:5672......
  • 一个简单的队列实现
    控制器代码<?phpnamespaceapp\index\controller;usethink\facade\Queue;classJobextends\app\BaseController{/***@定时任务**@returnvoid*/publicfunctiontest(){//参数$params=['id'=>......