首页 > 其他分享 >JDK中有直接可以使用的阻塞队列

JDK中有直接可以使用的阻塞队列

时间:2024-07-04 19:53:59浏览次数:21  
标签:util JDK Thread 队列 阻塞 InterruptedException queue new

是的,Java标准库(JDK)中提供了多个阻塞队列,可以直接使用。这些阻塞队列位于java.util.concurrent包中。阻塞队列是一种支持在某些操作无法立即完成时等待的队列,例如在队列为空时执行的take操作,或者在队列已满时执行的put操作。

以下是JDK中几种常见的阻塞队列及其特点:

1. ArrayBlockingQueue

ArrayBlockingQueue是一个基于数组的有界阻塞队列。其特点如下:

  • 固定大小(在创建时指定)。
  • FIFO(先进先出)顺序。
  • 可以指定公平性策略,以确保等待的线程按FIFO顺序访问队列。
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ArrayBlockingQueueExample {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

        // Producer
        new Thread(() -> {
            try {
                for (int i = 0; i < 10; i++) {
                    queue.put(i);
                    System.out.println("Produced: " + i);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();

        // Consumer
        new Thread(() -> {
            try {
                while (true) {
                    Integer item = queue.take();
                    System.out.println("Consumed: " + item);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }
}

2. LinkedBlockingQueue

LinkedBlockingQueue是一个基于链表的可选有界阻塞队列。其特点如下:

  • 可以指定大小,也可以默认大小(默认是Integer.MAX_VALUE)。
  • FIFO顺序。
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class LinkedBlockingQueueExample {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);

        // Producer
        new Thread(() -> {
            try {
                for (int i = 0; i < 10; i++) {
                    queue.put(i);
                    System.out.println("Produced: " + i);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();

        // Consumer
        new Thread(() -> {
            try {
                while (true) {
                    Integer item = queue.take();
                    System.out.println("Consumed: " + item);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }
}

3. PriorityBlockingQueue

PriorityBlockingQueue是一个支持优先级的无界阻塞队列。其特点如下:

  • 元素按照其自然顺序或者通过提供的比较器排序。
  • 没有容量限制(无界)。
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class PriorityBlockingQueueExample {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> queue = new PriorityBlockingQueue<>();

        // Producer
        new Thread(() -> {
            try {
                for (int i = 10; i > 0; i--) {
                    queue.put(i);
                    System.out.println("Produced: " + i);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();

        // Consumer
        new Thread(() -> {
            try {
                while (true) {
                    Integer item = queue.take();
                    System.out.println("Consumed: " + item);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }
}

4. SynchronousQueue

SynchronousQueue是一个不存储元素的阻塞队列。每个插入操作必须等待相应的移除操作,反之亦然。其特点如下:

  • 不存储元素。
  • 每个put操作必须等待一个take操作,反之亦然。
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.BlockingQueue;

public class SynchronousQueueExample {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> queue = new SynchronousQueue<>();

        // Producer
        new Thread(() -> {
            try {
                for (int i = 0; i < 10; i++) {
                    queue.put(i);
                    System.out.println("Produced: " + i);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();

        // Consumer
        new Thread(() -> {
            try {
                while (true) {
                    Integer item = queue.take();
                    System.out.println("Consumed: " + item);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }
}

总结

Java的java.util.concurrent包中提供了多种阻塞队列,包括ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueSynchronousQueue,可以根据不同的使用场景选择合适的阻塞队列。这些队列实现了流式处理,支持多线程环境下的高效数据传输和同步。

标签:util,JDK,Thread,队列,阻塞,InterruptedException,queue,new
From: https://www.cnblogs.com/gongchengship/p/18284552

相关文章

  • CentOS安装部署JDK8
    1.下载jdk8(1)、官网下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html2)百度网盘:链接:https://pan.baidu.com/s/1dTwKC65nDWBjmckWc-9igg?pwd=paxl提取码:paxl2、开始部署(1)解压jdk包,并将解压后的包移至想要存放的目录下,我放在/usr/loc......
  • 对于浏览器请求接口限制,是否有必要开发一套请求任务管理器组件,自主的去控制请求的并发
    在现代Web开发中,浏览器对同时发起的网络请求确实存在一定的限制,这个限制通常与浏览器的安全性和性能优化有关。不同浏览器对最大并发连接数有不同的默认设置,例如,Chrome和Firefox大致允许每个域名上同时有6到8个TCP连接,而IE可能更低。当超过这个限制时,额外的请求会被排队等待,直......
  • 【java开发环境】多版本jdk 自由切换window和linux
    win10一、准备各种版本的jdk,按自己的需要下载。我这里是需要jdk17和jdk8。1、jdk17下载:JavaDownloads|Oracle,选择exe后缀文件2、jdk8下载:JavaDownloads|Oracle,选择exe后缀文件二、详细步骤1、安装jdk很简单,双击exe文件后全部默认下一步即可,安装的时候记住安装......
  • [java]windows下jdk安装包所有版本系列下载地址汇总国内源下载
    jdk1.8及其以前版本可以参考[java]windows和linux下jdk1.8安装包所有版本系列下载地址汇总,这里只发布jdk9及其以后最新版本。注意下面均为windowsx64版本安装包exe格式序号java版本下载地址1jdk-22.0.1-windows-x64-bin.exe点我下载2jdk-21.0.3-windows-x64-bin.exe点我下......
  • jdk的Dockerfile构建
    JDKFROMcentos:[email protected]#时间更新RUN/bin/cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime\&&echo'Asia/Shanghai'>/etc/timezone#仓库源配置RUNrm-rf/etc/yum.repos.d/*.repo\&&curl......
  • Windows上实现jdk、Mysql(含数据)整体环境和配置以及数据迁移复用(Bat中实现jdk、mysq
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662前后端分离的系统,需要部署在windows服务器上,若后期需要部署的机器较多,则每台机器都需要安装jdk、配置jdk环境变量、安装mysql、配置mysql环境变量......
  • JAVA开发环境的搭建(JDK下载与安装)
    一、什么是JDK、JREJDK(JavaDevelopmentKit):是Java程序开发工具包,包含JRE和开发人员使用的工具。JRE(JavaRuntimeEnvironment):是Java程序的运行时环境,包含JVM和运行时所需要的核心类库。小结:        JDK=JRE+开发工具集(例如Javac编译工具等)        ......
  • 【LeetCode 0232】【设计】用FILO栈实现FIFO队列
    ImplementQueueusingStacksImplementafirstinfirstout(FIFO)queueusingonlytwostacks.Theimplementedqueueshouldsupportallthefunctionsofanormalqueue(push,peek,pop,andempty).ImplementtheMyQueueclass:*voidpush(intx)Pushes......
  • 使用Redis实现消息队列:List、Pub/Sub和Stream的实践
    摘要Redis是一个高性能的键值存储系统,它的多种数据结构使其成为实现消息队列的理想选择。本文将探讨如何使用Redis的List、Pub/Sub和Stream数据结构来实现一个高效的消息队列系统。1.消息队列的基本概念消息队列是一种应用程序之间进行通信的机制,允许应用程序以异步的......
  • jdk17 package sun.misc.BASE64Encoder 报找不到符号
    解决办法:对于只需要Base64编码的简单场景,可以考虑使用Java8及以上版本提供的内置`java.util.Base64`类,这是一个标准API,无需额外引入任何库: //importsun.misc.BASE64Encoder;//java8importjava.util.Base64;//java17publicclassBase64EncodingExample{......