首页 > 其他分享 >线程池与拒绝策略

线程池与拒绝策略

时间:2024-10-26 14:48:25浏览次数:6  
标签:策略 队列 拒绝 maximumPoolSize 任务 线程

在 Java 中,ThreadPoolExecutor 是线程池的核心实现类,它提供了丰富的配置选项和拒绝策略,用于高效管理线程的执行。线程池的七个参数和拒绝策略是线程池工作机制的重要组成部分,下面将详细解释它们的作用。

1. 线程池的七个参数

ThreadPoolExecutor 的构造函数包含七个关键参数,分别为:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
1.1 corePoolSize(核心线程数)
  • 作用:线程池中保持的核心线程数,即使在空闲时,线程池也会保存这么多线程,以备执行新的任务。
  • 说明:当提交一个新任务时,如果当前运行的线程数少于核心线程数,线程池会创建新线程来处理任务,而不管当前的线程是否处于空闲状态。
1.2 maximumPoolSize(最大线程数)
  • 作用:线程池中允许创建的最大线程数。当任务队列已满且当前线程数少于 maximumPoolSize 时,线程池会继续创建新线程来处理任务。
  • 说明:当任务队列满了且线程数达到 maximumPoolSize 后,新任务将被拒绝,触发拒绝策略。
1.3 keepAliveTime(线程存活时间)
  • 作用:当线程池中的线程数量大于 corePoolSize 时,多余的空闲线程在等待新任务时最多保持多长时间,然后终止。
  • 说明:此参数仅在线程池中线程数超过 corePoolSize 时才会生效。当线程数大于核心线程数时,如果空闲线程的存活时间超过 keepAliveTime,则会被回收。
1.4 unit(存活时间的时间单位)
  • 作用:指定 keepAliveTime 参数的时间单位。TimeUnit 是一个枚举类,常见的取值有 TimeUnit.SECONDSTimeUnit.MILLISECONDS 等。
1.5 workQueue(任务队列)
  • 作用:用来存放等待执行的任务的队列。任务在没有可用线程时,会先进入队列等待执行。
  • 常见队列类型
    • ArrayBlockingQueue:一个基于数组的有界阻塞队列。
    • LinkedBlockingQueue:一个基于链表的无界阻塞队列(理论上是无界,但有实际内存限制)。
    • SynchronousQueue:一个不存储元素的队列,每个插入操作必须等到另一个线程调用移除操作,否则会阻塞。
    • PriorityBlockingQueue:具有优先级的无界队列,任务会按照优先级进行调度。
1.6 threadFactory(线程工厂)
  • 作用:用于创建新线程。通过 ThreadFactory 可以自定义线程的创建方式,比如为线程设置名称、设置为守护线程等。
  • 默认实现Executors.defaultThreadFactory(),它会创建非守护线程,优先级为 Thread.NORM_PRIORITY
1.7 handler(拒绝策略)
  • 作用:当线程池的任务队列已满,且线程数达到了 maximumPoolSize 后,线程池会拒绝新的任务提交。此时的处理方式由拒绝策略决定。
  • 常见的拒绝策略
    • AbortPolicy(默认策略):直接抛出 RejectedExecutionException 异常,阻止系统正常运行。
    • CallerRunsPolicy:由调用线程处理该任务,也就是提交任务的线程会直接运行这个任务。
    • DiscardPolicy:直接丢弃任务,不抛出异常。
    • DiscardOldestPolicy:丢弃队列中最旧的任务(最早进入队列、最晚执行的任务),然后重新尝试执行当前任务。
    • 自定义策略:可以通过实现 RejectedExecutionHandler 接口来自定义拒绝策略。

2. 线程池的工作流程

  1. 任务提交:当向线程池提交一个任务时,如果当前线程数小于 corePoolSize,线程池会立即创建一个新线程来执行任务。
  2. 队列等待:如果线程数已经达到 corePoolSize,任务将被加入到 workQueue 中排队等待。
  3. 新线程创建:当队列已满并且线程数小于 maximumPoolSize 时,线程池会创建新线程来执行任务。
  4. 任务拒绝:如果队列已满并且线程数达到了 maximumPoolSize,线程池会根据指定的拒绝策略处理新任务。

3. 拒绝策略详解

3.1 AbortPolicy(抛出异常)
  • 描述:该策略会直接抛出 RejectedExecutionException,终止任务的执行。
  • 适用场景:适合对任务拒绝敏感的场景,保证任务提交失败时能够立即通知开发者进行异常处理。
3.2 CallerRunsPolicy(调用者运行策略)
  • 描述:该策略不会丢弃任务或抛出异常,而是让提交任务的线程直接执行该任务,减缓线程池的压力。
  • 适用场景:适合不能丢任务,但线程池压力不大的情况。通过让调用线程执行任务,降低系统的并发量。
3.3 DiscardPolicy(丢弃任务)
  • 描述:该策略会直接丢弃不能处理的任务,不会抛出任何异常。
  • 适用场景:适合对任务丢失不敏感的场景,比如日志处理、临时计算等非关键任务。
3.4 DiscardOldestPolicy(丢弃最旧任务)
  • 描述:该策略会丢弃队列中最旧的任务(队列头的任务),然后重新尝试提交当前任务。
  • 适用场景:适合优先处理最新任务的场景,确保新任务能够被及时处理。
3.5 自定义拒绝策略
  • 描述:开发者可以通过实现 RejectedExecutionHandler 接口来自定义拒绝策略。这样可以根据具体业务需求,灵活处理任务拒绝情况。

总结

ThreadPoolExecutor 提供了丰富的配置参数和拒绝策略,使得线程池能够在不同场景下灵活运作。合理设置线程池的核心线程数、最大线程数和任务队列,以及根据业务特点选择合适的拒绝策略,能够提高系统的性能和稳定性。

标签:策略,队列,拒绝,maximumPoolSize,任务,线程
From: https://blog.csdn.net/qq_35861084/article/details/143226403

相关文章

  • 基于CLIP的关键帧选择策略
    基于CLIP的关键帧选择策略:原理这种方法将整个视频划分为多个片段(clips),并从每个片段中提取能够代表该片段的关键帧。具体过程如下:使用CLIP提取特征:第一步是使用CLIP模型对视频的第一帧进行编码,生成特征向量,该向量包含了该帧的高级语义信息。CLIP能够将图像的视觉内容压缩为......
  • Java面试真题之中级进阶(线程,进程,序列化,IO流,NIO)
    前言本来想着给自己放松一下,刷刷博客,慕然回首,线程、程序、进程?Java序列化?Java中IO流?JavaIO与NIO的区别(补充)?似乎有点模糊了,那就大概看一下Java基础面试题吧。好记性不如烂键盘***12万字的java面试题整理***简述线程、程序、进程的基本概念。以及他们之间关系是什......
  • 短视频类app源码,线程创建并非使用线程池一种
    短视频类app源码,线程创建并非使用线程池一种,除此之外,以下线程池创建方式也不容错过。有三种使用线程的方法:实现Runnable接口;实现Callable接口;继承Thread类。实现Runnable和Callable接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需......
  • 鸿蒙编程江湖:ArkTS 的多线程与序列化支持
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。提升性能的高级技术在当今的软件开发领......
  • 鸿蒙案例实践:图像处理应用中多线程任务调度与性能优化
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。1.项目需求与目标分析背景:图像处理......
  • 多线程基础
    一、线程、程序、进程的定义及区别程序:一组计算机能识别和执行的指令、它是一些保存在磁盘上的指令的有序集合。进程:程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。线程与进程相似,但线程......
  • 电子电气架构---网络管理策略的分析(从整车到单件)
    我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节能减排。无......
  • 【系统设计】构建容错系统的6种有效方法:确保系统稳定性的关键策略
    在当今高度互联和依赖技术的时代,系统的可靠性和稳定性对企业和用户来说至关重要。无论是电子商务平台、金融系统还是社交媒体应用,任何系统的宕机或故障都可能导致用户体验受损,甚至带来巨大的经济损失。容错系统作为提高系统可靠性的重要手段,能够在部分组件或模块出现故障......
  • 如何进行多线程优化?
    为了提高程序的运行效率,多线程优化成为了一种重要的方法。本文将详细指导你如何进行多线程优化:1.识别并行化机会;2.保证线程安全;3.选择正确的并发工具;4.避免死锁和竞态条件;5.优化线程间的通信。为了成功地实施多线程优化,首先需要了解程序的瓶颈所在。1.识别并行化机会在程序中,......
  • java多线程
    Java中的多线程是Java编程语言的一个重要特性,它允许程序同时执行多个任务。在多线程环境中,每个线程都可以独立地执行任务,提高了程序的并发性和性能。本文将详细介绍Java中多线程的概念、实现方式以及多线程编程中的注意事项。一、多线程的概念多线程是指在一个程序中同时运......