了解Java的LinkedBlockingQueue

news2024/11/27 1:41:52

了解Java的LinkedBlockingQueue

LinkedBlockingQueue是一个基于链接节点的有界阻塞队列。它实现了BlockingQueue接口,可以在多线程环境中安全地进行插入、移除和检查操作。LinkedBlockingQueue的容量可以在创建时指定,如果未指定,则默认容量为Integer的最大值。

线程安全

LinkedBlockingQueue通过以下机制实现线程安全:

  1. 独占锁(ReentrantLock):队列内部使用两把不同的独占锁来管理入队和出队操作。入队操作和出队操作分别使用不同的锁,从而实现了入队和出队的并行操作,提高了性能。

  2. 条件变量(notEmpty和notFull)

    • notEmpty:用于等待队列不为空的条件。当消费者线程发现队列为空时,会在notEmpty上等待,直到有元素被生产者放入队列。
    • notFull:用于等待队列未满的条件。当生产者线程发现队列已满时,会在notFull上等待,直到有空间被消费者释放。
  3. 节点链接结构LinkedBlockingQueue使用链表节点来存储数据,每个节点包含一个数据元素和指向下一个节点的引用。入队操作会在链表的尾部插入新节点,出队操作会从链表的头部移除节点。

  4. 容量限制LinkedBlockingQueue可以通过构造函数指定容量,如果未指定则默认容量为Integer.MAX_VALUE。在插入元素时,如果队列已满,插入操作会被阻塞,直到有空间可用;在移除元素时,如果队列为空,移除操作会被阻塞,直到有元素可用。

通过上述机制,LinkedBlockingQueue能够在多线程环境中保证线程安全,同时在性能和资源利用率之间取得平衡。

使用方法

创建队列

可以通过指定容量来创建LinkedBlockingQueue

LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);

如果不指定容量,队列的默认容量为Integer.MAX_VALUE

LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();

插入元素

LinkedBlockingQueue提供了多种插入元素的方法:

  • put(E e):如果队列已满,则等待直到队列不再满。
  • offer(E e):如果队列已满,则返回false
  • offer(E e, long timeout, TimeUnit unit):在指定的时间内等待可用空间,如果超时则返回false
queue.put(1);
boolean success = queue.offer(2);
boolean successWithTimeout = queue.offer(3, 2, TimeUnit.SECONDS);

移除元素

LinkedBlockingQueue提供了多种移除元素的方法:

  • take():如果队列为空,则等待直到有元素可用。
  • poll():如果队列为空,则返回null
  • poll(long timeout, TimeUnit unit):在指定的时间内等待元素可用,如果超时则返回null
Integer item = queue.take();
Integer itemOrNull = queue.poll();
Integer itemOrNullWithTimeout = queue.poll(2, TimeUnit.SECONDS);

检查元素

LinkedBlockingQueue提供了检查元素的方法:

  • peek():返回队列头部的元素,但不移除它,如果队列为空,则返回null
Integer head = queue.peek();

应用场景

生产者-消费者模式

LinkedBlockingQueue非常适用于生产者-消费者模式。在这种模式中,生产者线程负责生产数据并将其放入队列中,消费者线程从队列中取出数据进行处理。LinkedBlockingQueue的阻塞特性可以有效地协调生产者和消费者的速度,避免数据丢失和资源浪费。

示例代码

class Producer implements Runnable {
    private final LinkedBlockingQueue<Integer> queue;

    public Producer(LinkedBlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            while (true) {
                int item = produce();
                queue.put(item);
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    private int produce() {
        // 生产数据的逻辑
        return new Random().nextInt();
    }
}

class Consumer implements Runnable {
    private final LinkedBlockingQueue<Integer> queue;

    public Consumer(LinkedBlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            while (true) {
                int item = queue.take();
                consume(item);
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    private void consume(int item) {
        // 消费数据的逻辑
    }
}

public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);
        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);

        new Thread(producer).start();
        new Thread(consumer).start();
    }
}

任务调度

在任务调度系统中,可以使用LinkedBlockingQueue来管理任务队列。调度器线程将任务添加到队列中,工作线程从队列中获取任务并执行。这样可以实现任务的均衡分配和并发处理,提高系统的响应速度和处理能力。

示例代码

class TaskScheduler {
    private final LinkedBlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<>();
    private final List<Thread> workers = new ArrayList<>();

    public TaskScheduler(int numberOfWorkers) {
        for (int i = 0; i < numberOfWorkers; i++) {
            workers.add(new Thread(new Worker(taskQueue)));
        }
        for (Thread worker : workers) {
            worker.start();
        }
    }

    public void schedule(Runnable task) throws InterruptedException {
        taskQueue.put(task);
    }

    private static class Worker implements Runnable {
        private final LinkedBlockingQueue<Runnable> taskQueue;

        public Worker(LinkedBlockingQueue<Runnable> taskQueue) {
            this.taskQueue = taskQueue;
        }

        @Override
        public void run() {
            try {
                while (true) {
                    Runnable task = taskQueue.take();
                    task.run();
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

参考链接

  • Baeldung: Java BlockingQueue
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1834954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么动态代理接口中可以不加@Mapper注解

为什么动态代理接口中可以不加Mapper注解 如下图&#xff1a; 我们上面的UserMapper上面没有加Mapper注解&#xff0c;按道理来说UserMapper这个类应该是注入不到IOC容器里面的&#xff0c;但是为什么我们程序的运行效果仍然是正常的呢&#xff1f;这是因为你的启动类上加了m…

机械产品数字样机通用要求

以下参&#xff1a;国家标准 GB/T26100-2010《 机械产品数字样机通用要求》 数字样机 (Digital Mock-Up,DMU) 对机械产品整机或具有独立功能的子系统的数字化描述&#xff0c;这种描述不仅反映了产品对象的几何属性&#xff0c;还至少在某一领域反映了产品对象的功能和性能。…

建筑工地通常那种考勤机好用?

建筑工地通常那种考勤机好用&#xff1f; 大量从乡村前往城市的务工者&#xff0c;所从事的多为建筑工程类行业&#xff0c;此种行业对学历与技能的要求不高&#xff0c;而工资水平倒也尚可&#xff0c;正因如此才吸引了众多劳动者。那要怎样管好工地上的项目呢&#xff1f;首要…

雷军-2022.8小米创业思考-10-高效率模型:便宜有好货;产品好,价格厚道,公司盈利;爆品模式,分摊成本;资金库存快速周转;铁人三项,硬件,新零售,互联网

第十章 高效率模型 小米方法论 “铁人三项”的商业模式 完整的“小米模式”。这种模式有很多反直觉的地方&#xff0c;需要跟“便宜无好货”等很多固有观念做斗争。有些讽刺的是&#xff0c;小米模式天生就是为实现“便宜有好货”而奋斗。 效率是小米模式的基石&#xff0c…

2024年618购物狂欢节买什么最超值!618不可错过的好物清单!

618年中大促再度来临。对于购物爱好者来说&#xff0c;这无疑是一个不容错过的购物盛宴。那么&#xff0c;在这个618&#xff0c;哪些好物值得你重点关注呢&#xff1f;我特地整理了一份推荐清单&#xff0c;这些产品不仅经过我的亲身体验&#xff0c;更以其出色的实用性和高性…

Linux ubuntu安装pl2303USB转串口驱动

文章目录 1.绿联PL2303串口驱动下载2.驱动安装3.验证方法 1.绿联PL2303串口驱动下载 下载地址&#xff1a;https://www.lulian.cn/download/16-cn.html 也可以直接通过CSDN下载&#xff1a;https://download.csdn.net/download/Axugo/89447539 2.驱动安装 下载后解压找到Lin…

MySQL中的客户端选项(三)

默认情况下&#xff0c;LOAD DATA的LOCAL功能是否可用取决于MySQL客户端库在编译时是否启用了该功能。 当只给出--local-infile&#xff08;不带值&#xff09;时&#xff0c;它启用LOCAL数据加载。当给出--local-infile0时&#xff0c;它禁用LOCAL数据加载。当给出--local-in…

深圳比创达|EMI电磁干扰行业:从挑战到机遇的蜕变

在当今科技日新月异的时代&#xff0c;电磁干扰&#xff08;EMI&#xff09;已成为影响电子设备性能和稳定性的重要因素。EMI电磁干扰行业因此应运而生&#xff0c;致力于研究和解决电磁干扰问题&#xff0c;确保电子设备的正常运行。 一、EMI电磁干扰行业面临的挑战 随着电子…

告别盲目投放,Xinstall全方位监测App广告效果

在移动互联网高速发展的今天&#xff0c;App广告已成为品牌与消费者沟通的重要桥梁。然而&#xff0c;如何确保广告投放的精准性和效果性&#xff0c;成为广告主们关注的焦点。在这个数据驱动的时代&#xff0c;Xinstall以其专业的App广告效果统计功能&#xff0c;为广告主们提…

一图看懂华为云CodeArts API 7大特性,带你玩转一站式API

华为云CodeArts API是API全生命周期一体化协作平台 &#xff0c;支持开发者高效实现API设计、API开发、API测试、API托管、API运维、API变现的一站式体验。以API契约为锚点&#xff0c;CodeArts API保证了API各阶段数据高度一致&#xff0c;为开发者提供友好易用的API全流程端到…

汇编语言程序设计 - 将当前目录下文件 FIE10.TXT 的所有小写字母改为大写字母,然后拷贝到当前目录文件 FILE20.TXT。

80x86汇编题目 题目描述&#xff1a;编写一个程序&#xff0c;将当前目录下文件 FIE10.TXT 的所有小写字母改为大写字母&#xff0c;然后拷贝到当前目录文件 FILE20.TXT。 思路&#xff1a; 1&#xff0c;分别打开两个文件&#xff0c;保存文件句柄 2&#xff0c;读取FILE1…

超级实用!20张中国农业地理地图

原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247674489&idx3&sn9548f799c3af85f5dc697d8bcbe79841&chksmfa777544cd00fc52a303b67605652304900eecc56b187a5483461488b3215417efb21e4a6b33&token1445576002&langzh_CN&scene21#we…

网上书店商城项目采用SpringBoot+Vue前后端分离技术(商家端、移动端、PC端)

项目简介&#xff1a; 本项目基于SpringBootVue2技术设计并实现了一个网上书店商城系统。系统的数据采用MYSQL数据库进行存储&#xff0c;开发工具选择为IDEA或VSCode工具。本商城系统具有前台购物功能和后台相应的信息管理。前台用户登陆注册后可以进行商品浏览、添加购物车、…

【代码屎山】离职前的最后1天,他手动退了600多个工作群

转载&#xff1a;人物当互联网大厂开始「治病」 顺便吆喝一声&#xff0c;如果你计算机、软件工程、电子等相关专业本科及以上学历&#xff0c;欢迎来共事。前后端/测试在线捞人&#xff0c;属于“技术大厂”&#xff0c;待遇给的还可以。 一起病了 36岁的百度程序员赵铭&…

骨传导耳机哪个牌子好?五款优质推荐,真实无广测评!

骨传导耳机作为一种全新的蓝牙耳机&#xff0c;凭借不入耳佩戴更健康等优点赢得了众多消费者的喜爱&#xff0c;随着骨传导耳机逐渐热门&#xff0c;其销量也逐渐升温&#xff0c;许多运动爱好者和户外工作者都纷纷入手。虽然骨传导耳机在户外运动、骑行、跑步等方面都有着广泛…

效率软件大盘点

Hey小伙伴们&#x1f495;&#xff01;知道你们都在追求高效工作生活&#xff0c;今天就来给大家种草五款超实用的国产工作App&#xff0c;让你的效率直线上升&#xff0c;再也不怕被工作追着跑啦&#xff01;&#x1f680; 1️⃣ 【亿可达】 - 软件连接器 &#x1f517; 作为…

聚鼎科技:现在的装饰画怎么做更好

在当代&#xff0c;装饰画作为室内装潢的重要元素之一&#xff0c;不仅能够美化空间&#xff0c;还能显现主人的品味与个性。那么&#xff0c;如何创作出更优质的现代装饰画呢? 选材创新是关键。传统的画布、纸张之外&#xff0c;可以尝试使用再生纸、环保布料、甚至电子屏幕等…

基于MYSQL的JAVA初级优化措施

世界是草台班子,这句话视乎很流行! 经历过几家创业公司的项目优化,以及大公司项目. 很多优化非常初级,用心点都能自己找出来! 其实主要原因当初是为了赶进度,能省则省.什么设计啊? 什么性能压测啊. 都省掉吧! 质量都要靠测试人员帮忙找出来,更何况是性能问题呢! 那怕是配齐了…

每天一个数据分析题(三百五十八)-图表决策树

图中是某公司记录销售情况相关的表建立好的多维分析模型&#xff0c;请根据模型回答以下问题&#xff1a; 1&#xff09;该模型属于哪种连接模式&#xff1f; A. 星型模式雪花模式 B. 星座模式雪花模式 C. 星座模式星型模式雪花模式 D. 以上都不对 数据分析认证考试介绍…

google chrome浏览器安装crx插件Jam

先上一张图&#xff1a; Jam是bug报告生成插件 1、在地址栏中输入chrome://extensions/&#xff0c;然后回车。 2、将下载好的crx插件&#xff0c;直接拖到里面就可以完成安装工作了。 3、测试了一下jam插件&#xff0c;发现直接没有响应。 4、点击【移除】直接可以删除插件…