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

线程池的工作流程

线程池的工作流程主要包括任务提交、线程分配、任务执行和线程回收等环节,以下是对其详细的描述:

  1. 任务提交

    • 当有任务需要执行时,用户通过线程池提供的提交方法,如execute()submit()方法,将任务(通常是实现了Runnable接口或Callable接口的对象)提交给线程池。
  2. 线程分配

    • 判断核心线程是否已满:线程池首先会检查当前正在运行的线程数量是否小于核心线程数corePoolSize。如果是,线程池会创建一个新的线程来执行提交的任务。
    • 任务入队:如果当前线程数量已经达到核心线程数,那么线程池会尝试将任务放入任务队列workQueue中。如果任务队列是有界队列且尚未满,任务会被成功放入队列中等待执行。
    • 判断最大线程数:如果任务队列已满,线程池会检查当前线程数量是否小于最大线程数maximumPoolSize。如果是,线程池会创建新的线程来执行任务,即使核心线程都在忙碌状态。
  3. 任务执行

    • 当有空闲线程时,它会从任务队列中获取任务。线程池中的线程在执行任务时,会调用任务的run()方法(如果是Runnable任务)或call()方法(如果是Callable任务)来执行具体的业务逻辑。
    • 如果任务执行过程中出现异常,默认情况下线程池会将异常抛出。不过,可以通过自定义的方式来处理这些异常,比如记录日志等。
  4. 线程回收

    • 判断是否为多余线程:当任务执行完成后,线程不会立即销毁,而是会进入空闲状态并等待新的任务。如果当前线程池中的线程数量超过了核心线程数,并且这些多余的线程在一定时间(keepAliveTime)内没有接收到新的任务,那么这些线程会被销毁,以释放资源。
    • 保持核心线程:核心线程默认情况下会一直存在于线程池中,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut(true),这样核心线程在空闲时间超过keepAliveTime后也会被回收。
  5. 拒绝策略处理

    • 如果线程池中的线程数量已经达到最大线程数maximumPoolSize,并且任务队列也已满,此时再提交新的任务,线程池会根据设置的拒绝策略handler来处理这些任务。如采用AbortPolicy策略会直接抛出异常,CallerRunsPolicy策略会让提交任务的线程来执行任务等。

相关文章:

  • VMware如何配置IP网络
  • java数据结构_Map和Set(一文理解哈希表)_9.3
  • 探索Elasticsearch:文档的CRUD
  • DeepSeek-OpenSourceWeek-第六天-Inference System Overview
  • Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
  • Qt基础入门-详解
  • Linux配置虚拟机
  • AMD RDNA3 GPU架构解析
  • Oracle数据库安全防护体系构建与核心技术解析
  • Excel的行高、列宽单位不统一?还是LaTeX靠谱
  • 厦门大学DeepSeek系列报告2份,《大模型概念、技术与应用实践》、《DeepSeek大模型赋能高校教学和科研》
  • 【软件安装】WebStorm现在免费,但是是非商业版本
  • 鸿蒙app 开发中如何计算两个点 之间的距离
  • 用工厂函数简化redis配置
  • 《Python编程调用本地部署大模型llava:7b :人工智能如何帮助医生诊断疾病》
  • 【PTA】1016 部分A+B
  • 我如何开发 Doc Java工具,简化文档模板生成
  • Hi3516DV300——Taurus开发环境搭建
  • About HP.FocusMode
  • 清华大学DeepSeek使用手册:6本502页大合集PDF下载
  • 单阶段遭遇零封偶像奥沙利文,赵心童要让丁俊晖预言成真
  • 月薪3万文科友好,“AI训练师”真有那么赚?
  • 印巴局势紧张或爆发军事冲突,印度空军能“一雪前耻”吗?
  • 短剧迷|《权宠》一出,《名不虚传》
  • 来上海喝云南咖啡!上海国际咖啡文化节助力咖啡产业破圈出海
  • 证监会:坚决拥护党中央对王建军进行纪律审查和监察调查决定