Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • 线程

  • 共享模型

    • 管程
    • JMM
    • 乐观锁
    • 线程池
    • J.U,C
    • 异步编程
    • 多线程编程
    • 动态线程池
      • Worker线程
      • Worker线程增加
      • 动态线程池参数动态化
  • 非共享模型

  • 并行

  • 多线程设计模式

  • JUC
  • 共享模型
Nreal
2023-12-03
目录

动态线程池

参考文章:

https://juejin.cn/post/7240065163486216253?searchId=20231203165817CBC489F5600224B8EE47

Nacos实现动态线程池:

https://juejin.cn/post/7263840667826503717?searchId=20231203171916C0A9AB29FEE1E9B719EB#heading-3

美团技术:

Java线程池实现原理及其在美团业务中的实践 - 美团技术团队 (meituan.com) (opens new window)

# Worker线程

线程池为了掌握线程的状态并维护线程的生命周期,设计了线程池内的工作线程Worker:

private final class Worker extends AbstractQueuedSynchronizer implements Runnable{
    final Thread thread;//Worker持有的线程
    Runnable firstTask;//初始化的任务,可以为null
}
1
2
3
4

如果firstTask非空,那么线程在启动初期立即执行这个任务,对应核心线程创建时情况;

如果firstTask为空,需要创建一个线程去执行任务队列种的任务,对应非核心线程的创建;

线程池用一张哈希表去持有线程的引用,管理线程的生命周期,线程不运行就要销毁线程,就是断开该引用,由JVM垃圾回收;

如何判断线程是否运行?

Worker继承自AQS,如果获取到独占锁,表示该线程在执行任务,不是独占锁状态,就是空闲线程,可以对该线程中断;

# Worker线程增加

addWorker两个参数(firstTask,core);

  • firstTask指定新增的线程执行的第一个任务,该参数可以为空;

  • core参数为true表示在新增线程时会判断当前活动线程数是否少于corePoolSize,false表示新增线程前需要判断当前活动线程数是否少于maximumPoolSize;

# 动态线程池参数动态化

JDK允许通过ThreadPoolExecutor的实例来动态设置线程池,

以setCorePoolSize为方法例,在运行期线程池使用方调用此方法设置corePoolSize之后,线程池会直接覆盖原来的corePoolSize值,并且基于当前值和原始值的比较结果采取不同的处理策略;

  • 对于当前值小于当前工作线程数的情况,说明有多余的worker线程,此时会向当前空闲的worker线程发起中断请求以实现回收,多余的worker在下次空闲的时候也会被回收;
  • 对于当前值大于原始值且当前队列中有待执行任务,则线程池会创建新的worker线程来执行队列任务;
多线程编程
ThreadLocal

← 多线程编程 ThreadLocal→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式