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

  • 使用场景

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

线程池的状态✔

相关推荐
麦兜*8 分钟前
【Spring Boot】Spring Boot 4.0 的颠覆性AI特性全景解析,结合智能编码实战案例、底层架构革新及Prompt工程手册
java·人工智能·spring boot·后端·spring·架构
野犬寒鸦16 分钟前
MyBatis-Plus 中使用 Wrapper 自定义 SQL
java·数据库·后端·sql·mybatis
expect7g23 分钟前
Java的DNS缓存问题
java·后端
oioihoii24 分钟前
C++11中的std::minmax与std::minmax_element:原理解析与实战
java·开发语言·c++
karry01301 小时前
高并发导致重复key问题--org.springframework.dao.DuplicateKeyException
java·数据库·ide
全栈凯哥1 小时前
20.缓存问题与解决方案详解教程
java·spring boot·redis·后端·缓存
小莫分享1 小时前
2023年最新总结,阿里,腾讯,百度,美团,头条等技术面试题目,以及答案,专家出题人分析汇总。
java·后端·面试·职场和发展
Brookty1 小时前
【操作系统】线程
java·linux·服务器·后端·学习·java-ee·操作系统
Dovis(誓平步青云)1 小时前
探索飞算 JavaAI 进阶:解锁高效Java开发的新维度
java·开发语言·飞算java
小雪_Snow1 小时前
多态 使用场景
java