线程池中的阻塞队列和拒接策略

2024-05-26 23:04

本文主要是介绍线程池中的阻塞队列和拒接策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 Java 中,线程池使用 java.util.concurrent 包中的 ThreadPoolExecutor 来管理线程。ThreadPoolExecutor 提供了几种不同类型的阻塞队列和拒绝策略,以便处理线程池中的任务调度和资源管理。

1. 阻塞队列(Blocking Queue)

阻塞队列用于保存等待执行的任务。ThreadPoolExecutor 支持以下几种阻塞队列:

  1. ArrayBlockingQueue:一个由数组支持的有界阻塞队列,按 FIFO(先进先出)原则对元素进行排序。
  2. LinkedBlockingQueue:一个由链表支持的可选有界阻塞队列。默认情况下,队列长度为 Integer.MAX_VALUE,但可以指定容量。
  3. SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等待另一个线程的相应移除操作。
  4. PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。队列中的元素根据其优先级自然顺序或者通过提供的 Comparator 进行排序。

2. 拒绝策略(Rejection Policy)

拒绝策略用于处理当线程池中的任务队列已满并且没有空闲线程时,提交的新任务。ThreadPoolExecutor 提供了以下几种内置的拒绝策略:

  1. AbortPolicy:默认拒绝策略。直接抛出 RejectedExecutionException,阻止系统正常工作。
  2. CallerRunsPolicy:由调用线程执行该任务。不会真正丢弃任务,但是会影响系统的性能,因为它阻塞了任务提交的线程。
  3. DiscardPolicy:直接丢弃任务,不予任何处理或抛出异常。这种策略可能会导致任务丢失。
  4. DiscardOldestPolicy:丢弃最旧的未处理任务,然后重新尝试执行任务。这种策略可能导致任务无序执行。

示例代码:

public static void main(String[] args) {// 创建线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(2,// 核心线程数为24,// 最大线程数为410, // 多余空闲线程的存活时间为10秒TimeUnit.SECONDS,// 存活时间的单位为秒new ArrayBlockingQueue<>(2),// 使用有界阻塞队列,容量为2Executors.defaultThreadFactory(),//默认的线程工厂new ThreadPoolExecutor.AbortPolicy() // 使用默认的拒绝策略(抛出 RejectedExecutionException));// 提交任务for (int i = 0; i < 10; i++) {int taskNumber = i;executor.execute(() -> {System.out.println("Executing task " + taskNumber);try {// 模拟任务执行时间Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}// 关闭线程池executor.shutdown();}

这篇关于线程池中的阻塞队列和拒接策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005834

相关文章

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结