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

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

相关文章

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s