Java线程池

概念

对线程进行创建和管理的

常用接口

1.ExecutorService---->线程池的操作访问

2.Executors类:创建线程池的工具类

3.ThreadPoolExecutor及其子类:封装线程池的核心参数和运行机制

常见方法

执行线程任务

execute()只能提交Runable类型的任务,没有返回值,提交的任务异常时直接抛出的;而submit()既能提交Runable类型任务也能提交Callable类型任务,可以返回Future类型结果,获取线程任务执行结果,捕获异常,当调用Future的get()方法获取返回值时,才会抛出异常;

关闭线程任务

  • shutdown()等待正在执行的任务先完成,然后再关闭。

awaitTermination()方法经常与shutdown()配合使用,用于检测线程池中的任务是否已经执行完毕

等待time>指定time&&线程池中线程运行完毕-----返回true

等待time>指定time&&线程池中线程未运行完毕-----返回false

等待time<指定time-----继续等待

  • shutdownNow()立刻停止正在执行的任务。

线程池的执行流程✔

当提交一个新的线程任务时,线程池会判断池内是否有空闲线程。如果有的话,它就为其任务分配空闲线程去执行该线程任务; 如果没有的话,它就会将线程池内目前的工作线程和核心线程数进行比较。如果工作线程小于核心线程数的话,它就会再创建核心线程,去直接分配执行编程任务。 如果工作线程大于核心线程数,它就会判断工作队列是否已满,如果工作队列没有满,它就会把刚才的线程任务放在工作队列,当有空闲线程出现时,从工作队列里面依次取出现成任务去执行。 如果工作队列也满了,它就会判断线程池里现有的线程数是否超出了最大的线程数。如果没有超出的话,它就会创建非核心线程去执行线程任务,如果超出的话,它就会执行拒绝策略。

线程池的配置参数✔

  • corePoolSize线程池核心线程数

  • maxmumPoolSize 线程池最大线程数

  • keepAliveTime非核心线程线程存活时间

  • TimeUnit时间单位

  • BlockingQueue 阻塞工作队列

  • ThreadFactory 线程工厂

  • RejectedExecutionHandler拒绝策略

拒绝策略分类✔

  • AbortPolicy 默认策略,丢弃任务并抛出RejectedExecutionException异常

  • DiscardPolicy 丢弃任务,但是不抛出异常

  • DiscardOldestPolicy丢弃工作队列中的队头任务(即最旧的任务,最早进入队列的任务)

  • CallerRunPlicy 谁调用谁执行,由原调用线程处理该任务

  • 自定义拒绝策略

线程池的分类✔

区别✔

FixedThreadPool

线程数固定的线程池

  • 线程池参数

    • 核心线程数和最大线程数一致

    • 非核心线程线程空间存活时间,即KeepAliveTime为0

    • 阻塞队列为无界队列LinkBlockingQueue

  • 工作机制

    a.提交线程任务

    b.如果线程数少于核心线程,创建核心线程执行任务

    c.如果线程数等于核心线程,把任务添加到LinkedBlockingQueue祖泽队列

    d.如果线程执行完任务,去阻塞队列取任务,继续执行

  • 使用场景

    适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能的少的分配线程,即适用执行长期的任务。

CacheThreadPool

可缓存线程池,线程数根据任务动态调整的线程池

  • 线程池参数

    • 核心线程数为0

    • 最大线程数Integet.MAX_VALUE

    • 工作队列是SynchronousQueue同步队列

    • 非核心线程空闲存活时间为60s

  • 工作机制

    a.提交线程任务

    b.因为核心线程数为0,所以任务直接加到SynchronousQueue工作队列

    c.判断是否有空闲线程,如果有,就去取出任务执行

    d.如果没有空闲线程,就新建一个线程执行

    e.执行完任务的线程,还可以存活60s,如果在此期间,街道任务,可以继续存活下去,否则被销毁。

  • 使用场景

    用于并发执行大量短期的小任务

SingleThreadPool

单线程化的线程池

  • 线程池参数

    • 核心线程数为1

    • 最大线程数为1

    • 阻塞队列是LinkedBlockingQueue

    • 非核心线程空闲存活时间为0s

  • 使用场景

    适用于串行执行任务的场景,将任务按顺序执行

ScheduledThreadPool

能实现定时、周期性任务的线程池

  • 线程池参数

    • 最大线程数为Integet.MAX_VALUE

    • 阻塞队列是DelayedWorkQueue

    • 非核心线程空闲存活时间为0s

  • 使用场景

    周期性执行任务,并且需要限制线程数量的需求场景

线程池的状态✔

相关推荐
张张张31214 分钟前
4.2学习总结 Java:list系列集合
java·学习
KATA~17 分钟前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
xyliiiiiL33 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing34 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian1 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码2 小时前
Spring Task 定时任务
java·前端·spring
俏布斯2 小时前
算法日常记录
java·算法·leetcode
27669582922 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿