线程池阻塞队列详解

一、线程池阻塞队列有哪几种

线程池阻塞队列有四种类型的阻塞队列:

  • 无界队列
  • 有界队列
  • SynchronousQueue
  • DelayQueue

二、线程池阻塞队列的选择

根据业务特点,我们需要选择合适的阻塞队列类型。如果线程池的线程数是无限的,可以选择无界队列;如果线程池的线程数是有限的,可以选择有界队列或SynchronousQueue;如果需要实现延迟执行任务,可以选择DelayQueue。

三、线程池阻塞队列的概念

线程池阻塞队列是指在任务提交到线程池后,如果线程池的线程数量已经达到最大值,那么剩余的任务将会被放到一个阻塞队列中,这个队列就是线程池的阻塞队列。

四、线程池阻塞队列大小设置

线程池阻塞队列大小设置与业务需求有关。如果业务中提交的任务量较大,可以适当增加队列大小,以避免任务被拒绝。但是要注意,队列过大可能会导致oom,因此需要在合理的范围内设置队列大小。

五、线程池阻塞队列源码

public interface BlockingQueue extends Queue {
    //添加元素到队尾,如果队列已满,将会阻塞
    void put(E e) throws InterruptedException;

    //从队头获取元素,如果队列为空,将会阻塞
    E take() throws InterruptedException;
}

public class LinkedBlockingQueue extends AbstractQueue implements BlockingQueue, Serializable {
    //默认队列大小为Integer.MAX_VALUE
    public LinkedBlockingQueue() {
        this(Integer.MAX_VALUE);
    }

    //指定队列大小
    public LinkedBlockingQueue(int capacity) {
        if (capacity <= 0) throw new IllegalArgumentException();
        this.capacity = capacity;
        last = head = new Node(null);
    }

    private static class Node {
        E item;
        Node next;
        Node(E x) { item = x; }
    }

    //添加元素到队尾,如果队列已满,将会阻塞
    public void put(E e) throws InterruptedException {
        if (e == null) throw new NullPointerException();
        int c = -1;
        Node node = new Node(e);
        final ReentrantLock putLock = this.putLock;
        final AtomicInteger count = this.count;
        putLock.lockInterruptibly();
        try {
            while (count.get() == capacity) {
                notFull.await();
            }
            enqueue(node);
            c = count.getAndIncrement();
            if (c + 1  1)
                notEmpty.signal();
        } finally {
            takeLock.unlock();
        }
        if (c == capacity)
            signalNotFull();
        return x;
    }
}

六、线程池阻塞队列与拒绝策略

线程池阻塞队列与拒绝策略是相辅相成的,当任务提交到线程池后,如果线程池中的线程已经达到最大值并且线程池阻塞队列已经满了,就需要使用拒绝策略处理剩余的任务。

七、线程池阻塞队列的作用

线程池阻塞队列的作用是缓存任务,避免任务被拒绝。当线程池中的线程数量已经达到最大值后,剩余的任务就会放到阻塞队列中等待处理。

八、线程池阻塞队列导致oom

线程池阻塞队列如果过大,可能会导致oom。因此,在设置队列大小时需要注意避免过大。

九、线程池阻塞队列满了

当线程池阻塞队列满了,新提交的任务就会被拒绝。此时可以使用拒绝策略来处理剩余的任务。

十、线程池阻塞队列的长度选取

选择线程池阻塞队列的长度应该考虑业务需求。如果任务量很大,可以适当增加队列大小;如果希望更快的响应任务,可以适当减小队列大小。

原创文章,作者:DGBM,如若转载,请注明出处:https://www.506064.com/n/141976.html

(0)
DGBMDGBM
上一篇 2024-10-09
下一篇 2024-10-10

相关推荐

  • cad中公差的上下偏差,cad中公差的上下偏差快捷键

    本文目录一览: 1、CAD2010如何标注上下尺寸偏差 2、cad中怎样标注上下公差 3、cad中怎么标注上下偏差 CAD2010如何标注上下尺寸偏差 CAD2010标注上下尺寸偏…

    编程 2024-10-03
  • chart.jslegend的简单介绍

    本文目录一览: 1、js代码怎么比较柱状的数值的大小赋予柱状不同颜色 2、echarts.js 一个页面如何加载多个表 我想加载两个饼图 为什么只出来一个 求大神解救 3、使用Ch…

  • 语雀代码块详解

    一、语雀代码块搜索 语雀中代码块具备搜索功能,可以通过快捷键“Ctrl+K”调出搜索框,并在其中输入关键词,快速找到想要的代码块。除此之外,还可以通过语雀中的全局搜索栏进行代码块的…

    编程 2024-10-04
  • Python列表操作:查找元素位置的方法

    一、使用index()方法查找元素位置 list1 = [‘apple’, ‘banana’, ‘cherry’] x = list1.index(“banana”) print(…

    编程 2024-10-04
  • js编程环境框架(js编程环境框架图)

    本文目录一览: 1、JS的常用开发框架有哪些 2、JS有哪些框架? 3、javascript框架有哪些 4、JS有哪些框架 5、有哪些优秀的前端js框架 6、什么是js框架? JS…

  • 如何解决过拟合问题

    机器学习算法是从数据中学习的过程,它将训练样本数据转化为模型,进而应用于测试数据。本文将介绍机器学习中常见的过拟合问题,并提出解决过拟合的方法。 一、模型过拟合怎么解决 模型过拟合…

    编程 2024-10-04
  • javajson转list,java把字符串转为json

    本文目录一览: 1、java 怎么将jsonarray转换成list 2、Json对象转化为list 3、如何把JsonObject转换为list 4、java 怎么将List类型…

    编程 2024-10-04
  • CentOS查看防火墙开放端口

    一、CentOS查看防火墙状态 在Linux系统中,防火墙是非常重要的组成部分之一,负责保障系统的安全。在CentOS系统中,默认开启了iptables防火墙。如果要查看CentO…

    编程 2024-10-04
  • 全方位解析:192.168.2.105

    一、192.168.2.105路由器管理登录 如果您使用的是192.168.2.105路由器,请按照以下步骤进行管理登录: Step1:将计算机与192.168.2.105路由器连…

    编程 2024-10-04
  • Oracle中的Rownum用法详解

    一、Rownum概念和用途 Rownum是Oracle数据库中的一种伪列,它不是一个真实的列,而是Oracle在运行时自动分配给每一行的一个行号。通过Rownum,我们可以方便地控…

    编程 2024-10-14

发表回复

登录后才能评论