当前位置: 首页 > backend >正文

线程池总结

线程池是一种使用预创建线程的集合来优化和管理线程使用的技术,以避免在请求时创建和销毁线程的开销。在Java中,线程池的核心实现是通过ThreadPoolExecutor类,它提供了执行提交任务的功能。

1.线程池的参数介绍

我们以jdk文档中的来详细介绍

      • public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)

        创建一个新的 ThreadPoolExecutor与给定的初始参数。

        参数

     1.int corePoolSize

 (核心线程数)即使空闲时仍保留在池中的线程数,除非设置 allowCoreThreadTimeOut

 2.int maximumPoolSize

线程总数 包括核心线程数与非核心线程数)池中允许的最大线程数

    3.long keepAliveTime

非核心线程的最长摆烂时间)当线程数大于内核时,这是多余的空闲线程在终止前等待新任务的最大时间

    4. TimeUnit unit

     参数的时间单位

   5. BlockingQueue<Runnable> workQueue

用于在执行任务之前使用的队列。 这个队列将仅保存execute方法提交的Runnable任务

   先进后出队列模型

   6.ThreadFactory threadFactory

执行程序创建新线程时使用的工厂

   7.​​​​​​​ RejectedExecutionHandler handler

执行被阻止时使用的处理程序,因为达到线程限制和队列容量

以下为四种拒绝策略:

2.线程池的工作流程

当一个新任务提交到线程池时,线程池会按照以下流程处理任务:

  1. 核心线程检查:线程池首先检查核心线程池(corePoolSize)中是否有线程空闲。如果有空闲线程,就使用这些线程执行新任务。如果核心线程都在忙,则进入下一步。

  2. 任务队列检查:线程池会检查任务队列(workQueue)是否已满。如果队列未满,新提交的任务将被放入队列中等待执行。如果队列已满,则进入下一步。

  3. 最大线程数检查:线程池会检查当前运行的线程数是否小于最大线程数(maximumPoolSize)。如果小于,线程池会创建新的线程来执行任务。如果已达到或超过最大线程数,则任务将被拒绝,并执行拒绝策略(RejectedExecutionHandler)。

线程池有五种状态:RUNNINGSHUTDOWNSTOPTIDYINGTERMINATED。可以通过shutdown()shutdownNow()方法来关闭线程池。shutdown()方法会使线程池进入SHUTDOWN状态,只中断空闲线程;而shutdownNow()方法会使线程池进入STOP状态,中断所有线程

3.使用Executors创建常见的线程池

1newFixedThreadPool 创建一个固定大小的线程池,可控制线程最大并发数,超出的线程会在队列中等待。适用于负载比较重的服务器,为了资源的合理利用,需要限制当前线程数量。

2.newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。适用于并发执行大量短期的小任务,或者是负载较轻的服务器。

http://www.xdnf.cn/news/2049.html

相关文章:

  • 东南亚与中东小游戏市场出海调研报告
  • Properties配置文件
  • Spring Boot 中使用 Feign 调用内网 IP 接口并记录入参与出参
  • springboot启动的端口如何终止
  • Web4.0身份革命:去中心化身份系统的全栈实现路径
  • 如何将 sNp 文件导入并绘制到 AEDT (HFSS)
  • IMX675-AAQR-C 索尼图像传感器 属于索尼 Starvis 2 系列,主打 高灵敏度、低噪声,适用于工业检测、安防监控、机器视觉等场景 提供数据手册
  • Cancer Cell|scRNA-seq + scTCR + 空间多组学整合分析,揭示CD8⁺ T细胞在免疫治疗中的“双路径” | 临床问题的组学解答
  • UR5 UR5e机器人URDF文件
  • 精华贴分享|【牛马课题】可转债多策略研究-1【基础篇】
  • Linux部署ragflow,从安装docker开始~
  • commix
  • 巧记英语四级单词 Unit5-上【晓艳老师版】
  • keil修改字体无效,修改字体为“微软雅黑”方法
  • 函数的定义与使用(python)
  • windows server安装winget
  • 【进阶】C# 泛型知识点整理归纳
  • Git命令行中vim的操作
  • 9.ArkUI List的介绍和使用
  • 云+AI双轮驱动,亚马逊云科技加速中国企业出海新浪潮
  • OCR定制识别:解锁文字识别的无限可能
  • Windows 安全设置不允许下载文件
  • SpringCloud基于Eureka和Feign实现一个微服务系统
  • Python----深度学习(基于深度学习Pytroch簇分类,圆环分类,月牙分类)
  • B站C语言课程笔记3
  • 《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现
  • 开发小程序后端用PHP好还是Java哪个好?
  • 【N8N】Docker Desktop + WSL 安装过程(Docker Desktop - WSL update Failed解决方法)
  • 大内存生产环境tomcat-jvm配置实践
  • 同一页面下动态加载内容的两种方式:AJAX与iframe