首页 > 编程语言 >java线程池

java线程池

时间:2024-04-24 10:25:52浏览次数:28  
标签:java 队列 核心 keepAliveTime 任务 线程 创建

java线程池

  一、线程池的7个核心参数

  1. corePoolSize 核心线程数

  corePoolSize 是线程池中保持活动状态的最小线程数。 即使线程是空闲的,它们也会一直保持在池中。 当有新任务提交时,线程池会优先创建核心线程来处理任务。

  2. maximumPoolSize 最大线程数

  maximumPoolSize 是线程池中允许的最大线程数。 如果任务数超过了核心线程数,且任务队列已满,线程池会创建新的线程,但不会超过最大线程数。

  3. keepAliveTime 线程空闲时间
  keepAliveTime 是非核心线程在空闲时可以存活的时间。 当线程空闲时间超过 keepAliveTime,多余的非核心线程将被终止,以减少资源消耗。这个参数配合 TimeUnit 来定义时间单位。

  4. unit 时间单位

  unit 是与 keepAliveTime 一起使用的时间单位。 它表示 keepAliveTime 的时间单位,可以是秒、毫秒、微秒等。workQueue(任务队列):

  5. workQueue 任务等待队列

  workQueue是一个阻塞队列,用于存储等待执行的任务。 当任务数超过核心线程数时,多余的任务会被放入任务队列中。 常见的队列类型包括 LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue 等。  

  6. threadFactory 线程工厂

  用于创建新线程。 可以通过自定义线程工厂来配置线程的名称、优先级、是否为守护线程等属性。

  7. handler 拒绝策略

  handler 是当工作队列和线程池都满了之后采取的饱和策略。 常见的饱和策略有 AbortPolicy(默认,抛出异常)、CallerRunsPolicy(由调用线程执行任务)等。这些参数在创建线程池时进行配置,通过合理调整这些参数,可以使线程池适应不同的工作负载和性能需求。例如,通过调整核心线程数和最大线程数,可以优化线程池在不同负载下的性能表现。

  二、 线程池是怎么运转的

  如下图:

     

  举例来说:核心线程数量为 5 个;全部线程数量为 10 个;工作队列的长度为 5。

  1.   刚开始都是在创建新的线程,达到核心线程数量 5 个后,新的任务进来后不再创建新的线程,而是将任务加入工作队列;

  2.  任务队列到达上线 5 个后,新的任务又会创建新的普通线程,直到达到线程池最大的线程数量 10 个;后面的任务则根据配置的拒绝策略来处理。如果没有配置,使用的是默认的配置 AbortPolicy:直接抛出异常。

  3.  当前任务小于最大线程数的时候,线程资源会保持核心线程池个数的线程,其他超过的线程资源在存活时间超过之后会被回收。

  

 

标签:java,队列,核心,keepAliveTime,任务,线程,创建
From: https://www.cnblogs.com/hld123/p/18154490

相关文章

  • 「Java开发指南」如何利用MyEclipse启用Spring DSL?(二)
    本教程将引导您通过启用SpringDSL和使用ServiceSpringDSL抽象来引导Spring和Spring代码生成项目,本教程中学习的技能也可以很容易地应用于其他抽象。在本教程中,您将学习如何:为SpringDSL初始化一个项目创建一个模型包创建一个服务和操作实现一个服务方法启用JAX-WS和DWR......
  • Java 断言 Assert 使用教程与最佳实践
    本文收录于Github.com/niumoo/JavaNotes,Java系列文档,数据结构与算法!本文收录于网站:https://www.wdbyte.com/,我的公众号:程序猿阿朗作为一个Java开发者,如果要问你Java中有哪些关键字,你可能会随口说出一串,如果问你Java有哪些最不常使用的关键字,或许你还能说出几个。但是......
  • 挑战前端基础120题--JavaScript 中如何实现链式调用的函数?
    一.何为链式调用?链式调用是一种简化过程的编码方式,使代码看起来更加简洁~它允许你通过在方法调用之间返回对象本身,从而连续地调用多个方法;比较常见的链式调用:jQuery,Promise等,通过多次书写.或()操作来调用。二.实现的原理?每次执行完成后返回自己/新的自己,这样可以确保后续的......
  • JavaImprove--Lesson10--IO流-字符流,缓冲流,转换流,打印流,数据流
    一.IO流-字符流上期在字节流的学习中,了解到字节流写字符操作表现很不好,随时面临乱码的情况,一下写完全部数据的,内存可能不足,所以对于文本操作还需要专业的操作 而字符流就非常适合操作文本字符FileWirte文件字符输入流作用:以内存为基准,可以把文件的数据以字符的形式输入到......
  • Java SE 笔记搬运
    本科过过两遍JavaSE,但是由于考研等不可抗力因素很久未接触代码,因工作需求这里将四年前的Java笔记重新整理搬运,方便Java学习。——————————————————————————————————————————————————————————————继承/*私有化的......
  • 解决多线程竞争条件——临界区
    如图所示,黑色表示没有获得CPU,绿色表示获得CPU,假设为单核两线程程情况。线程1开始运行,并进入临界区,在出临界区运行过程中到了上下文切换时间。线程2获得CPU,正常运行一段时间后需要运行至临界区代码,此时,线程1位于临界区。因为不能两个线程同时位于临界区,所以线程2阻塞。线程1获......
  • 详细分析Java中的@JsonFormat注解和@DateTimeFormat注解
    @DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")privateDatecreated_on;在前后端数据交互的过程中,Data类型的数据经常会出现类型映射转换的错误,为了达到业务的目标时间格式,通常会使用@JsonFormat和@DateTi......
  • Java并发工具类之LongAdder原理总结
    出处: Java并发工具类之LongAdder原理总结LongAdder实现原理图                                高并发下N多线程同时去操作一个变量会造成大量线程CAS失败,然后处于自旋状态,导致严重浪费CPU资源,降低了并发......
  • MyBatis所有的jdbcType类型对应的javaType类型
    来源:https://www.jb51.net/program/287517rew.htmMyBatis处理MySQL字段类型date与datetime1)DATETIME显示格式:yyyy-MM-ddHH:mm:ss时间范围:['1000-01-0100:00:00'到'9999-12-3123:59:59']2)DATE显示格式:yyyy-MM-dd时间范围:['1000-01-01'到'9999-12-31'......
  • cmd命令行运行Java文件产生乱码问题的解决方式
    1.第一种方式(改变记事本的编码集为ANSI)另存为ANSI 这样就OK啦2.第二种方式 改变cmd编码集 javac-encodingutf8 源文件名.java ......