首页 > 其他分享 >1.JDK自带的线程池有哪些?2.线程池中核心线程数与最大线程数与缓冲任务队列的关系?3.为什么阿里巴巴不让使用JDK自带的线程池?4.你们是怎么使用线程池的?

1.JDK自带的线程池有哪些?2.线程池中核心线程数与最大线程数与缓冲任务队列的关系?3.为什么阿里巴巴不让使用JDK自带的线程池?4.你们是怎么使用线程池的?

时间:2024-09-21 15:55:44浏览次数:11  
标签:JDK 队列 创建 maximumPoolSize 任务 线程 自带

1.JDK自带的线程池有哪些?





2.线程池中核心线程数与最大线程数与缓冲任务队列的关系?

在Java中的线程池(如ThreadPoolExecutor)中,核心线程数(corePoolSize)、最大线程数(maximumPoolSize)以及缓冲队列(workQueue)之间存在着密切的关系,它们共同决定了线程池如何管理和调度任务。以下是它们之间的关系概述:

  1. 核心线程数 (corePoolSize)

  2. 核心线程是线程池中最基础的线程数,即使在没有任务执行时,也会一直存活在线程池中。

  3. 当提交新任务时,线程池首先尝试创建或保持至多corePoolSize个线程来处理任务(长工)。

  4. 最大线程数 (maximumPoolSize)

  5. 当核心线程数全部处于活动状态且仍有新任务提交时,线程池将创建额外的线程(临时工),直至线程总数达到maximumPoolSize。

  6. 当线程数达到maximumPoolSize时,线程池不会再创建新的线程,除非现有线程中有线程终止。

  7. 缓冲队列 (workQueue)

  8. 只要有任务,新提交的任务会被放入缓冲队列中等待执行,当有长工不忙的时候,长工领任务执行.

  9. 当所有核心线程都在忙,并且缓冲队列尚未满时,新提交的任务也会被放入队列中排队(等待长工去执行)。

  10. 若队列已满(即有界队列的情况),并且线程数未达到maximumPoolSize,线程池会创建新的非核心线程(临时工)来执行任务。

  11. 当线程数已经达到maximumPoolSize,而缓冲队列也已经满了,这时线程池将依据预先设定的拒绝策略来处理无法接受的任务,例如丢弃任务、抛出异常或调用用户自定义的拒绝处理器。

综上所述,线程池的工作机制是这样的:

  • 先使用核心线程执行任务。

  • 当核心线程不足时,新任务入队列等待。

  • 当队列满且线程数未达最大值时,增加非核心线程执行任务。

  • 当队列满且线程数已达最大值时,触发拒绝策略处理新来的任务。

3.为什么阿里巴巴不让使用JDK自带的线程池?



阿里巴巴不让使用JDK自带的

线程池.mp4(5.3 MB)

阿里巴巴在《阿里巴巴Java开发手册》中建议开发者不要直接使用 java.util.concurrent.Executors 类中的静态工厂方法来创建线程池,而是推荐直接使用 ThreadPoolExecutor 类来实例化线程池,主要原因如下:

  1. 资源耗尽的风险: JDK内置的 Executors 工厂方法创建的线程池往往具有固定的配置,比如 newFixedThreadPool 创建的是固定大小线程池,newCachedThreadPool 创建的是可无限扩大的线程池,这些配置可能并不适用于所有的场景。尤其像 newCachedThreadPool,如果不加以控制,当任务量过大时,可能导致创建过多线程,进而耗尽系统资源(如内存),甚至引发 OutOfMemoryError 错误。

  2. 拒绝策略不明确Executors 提供的预设线程池配置对拒绝策略的处理不够明确,开发者可能不清楚在任务堆积严重时,线程池具体是如何处理新提交的任务的。而直接使用 ThreadPoolExecutor 可以让开发者显式指定拒绝策略,对系统的稳定性和可控性有更好的把握。

  3. 线程池参数优化ThreadPoolExecutor 允许自定义更多的参数,如线程存活时间、队列类型和大小等,这样可以根据实际应用场景调整线程池行为,使之更符合业务需求,提高性能并防止潜在的问题。

  4. 监控和调试难度: 自定义线程池可以更容易地集成到监控系统中,方便开发者随时观察线程池的状态,及时发现问题并进行调整。

总结起来,阿里巴巴之所以推荐使用 ThreadPoolExecutor 手动创建线程池,是为了增强系统稳定性,降低资源耗损风险,并提升开发者对线程池行为的控制能力。

4.你们是怎么使用线程池的?

ExecutorService executor = ExecutorBuilder.create()
	.setCorePoolSize(5)
	.setMaxPoolSize(10)
	.setWorkQueue(new LinkedBlockingQueue<>(100))
	.build();

标签:JDK,队列,创建,maximumPoolSize,任务,线程,自带
From: https://blog.csdn.net/zhzjn/article/details/142418318

相关文章

  • 全面解析 JDK17新特性:密封类、模式匹配、文本块、垃圾回收等最新功能详解
    引言JDK17作为Java的长期支持(LTS)版本,引入了许多新特性和改进,这些更新不仅提升了代码的可读性和可维护性,还增强了性能。本文将详细探讨JDK17的关键新特性,包括密封类、模式匹配、文本块、增强的垃圾回收机制等,并附上代码示例,帮助你更好地理解和应用这些特性。1.密封......
  • 线程(一) 线程的分类、创建、终止
    文章目录线程线程引入进程线程进程和线程的关系进程和线程相比优缺点线程的分类线程的创建线程标识线程创建示例--龟兔赛跑创建线程后内存空间的变化线程终止线程终止后它所占有的资源如何变化示例--线程终止(子线程将普通变量返回给主线程)示例--代码优化(龟兔赛跑)......
  • 1024个线程居然不够用?RPC 线程池被打满!
    打开公司群,就看见群里有人讨论:线上环境出现大量RPC请求报错,异常原因:被线程池拒绝。虽然异常量很大,但是异常服务非核心服务,属于系统旁路,服务于数据核对任务,即使有大量异常,也没有实际的影响。原来有人在线上刷数据,产生了大量binlog,数据核对任务的请求量大幅上涨,导致线程池被打满。第......
  • [操作系统]线程在 Linux 中的实现
    线程在Linux中的实现线程机制是现代编程技术中常用的一种抽象概念。该机制提供了在同一程序内共享内存地址空间运行的一组线程。这些线程还可以共享打开的文件和其他资源。线程机制支持并发程序设计技术(concurrentprogramming),在多处理器系统上,它也能保证真正的并行处理(para......
  • Nodejs 揭秘:单线程魔法背后的真相以及它如何为高性能应用程序提供动力
    Node.js有时被称为“单线程”,这个词对于习惯了Java或.NET等多线程环境的开发人员来说可能会令人困惑,甚至令人畏惧。然而,Node.js如何处理作业的真相远比这个简单术语所暗示的复杂和强大。在这篇博客中,我们将了解Node.js的架构、单线程意味着什么,以及Node.js如何通过其独......
  • JavaScript 如何在后台工作:了解其单线程性质和异步操作
    javascript是网络的支柱,为数十亿网站和应用程序提供动态客户端功能。但您有没有想过javascript是如何在后台发挥其魔力的?在这篇文章中,我们将深入研究javascript单线程本质的内部工作原理,并探索异步编程的概念。单线程是什么意思?当我们说javascript是“单线程”时,这意......
  • C++ 多线程知识汇总
    https://zhuanlan.zhihu.com/p/194198073 (防链接失效)程序使用并发的原因有两种:为了关注点分离(程序中不同的功能,使用不同的线程去执行),当为了分离关注点而使用多线程时,设计线程的数量的依据,不再是依赖于CPU中的可用内核的数量,而是依据概念上的设计(依据功能的划分);为了提高性能......
  • 亿级数据表多线程update锁表问题
    目录1、问题描述2、原因分析3、问题解决1、问题描述在pg数据库,某个业务,有一张数据表test,数据表结果如下:test(sjjbh,wlbid,gzmb,sfzg,zgsj,cjsj,xx...),这个表没有主键,会有很多重复数据。test表需要根据另外表(是多张表),动态更新sfzg字段, 加入另外表结构如下sjj_ckb1(......
  • java线程池闭坑指南
    专业在线打字练习网站-巧手打字通,只输出有价值的知识。一前言线程池作为初学者常感困惑的一个领域,本次“巧手打字通课堂”将深入剖析其中几个最为普遍的误区。为了更清晰地阐述这些知识点,让我们以一个具体定义的线程池为例来展开说明。如下:ThreadPoolExecutorexecutor=ne......
  • C# 报错:System.Threading.ThreadStateException:”当前线程不在单线程单元中,因此无法
    原因分析System.Threading.ThreadStateException 错误通常发生在尝试在非UI线程中创建或访问 ActiveX 控件(如COM 组件)时。在 Windows Forms应用程序中,所有 UI操作必须在创建该UI 的线程(通常是主线程)上执行。解决方案要解决这个问题,你需要确保在 UI 线程上创建......