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

  • 使用场景

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

线程池的状态✔

相关推荐
七星静香15 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员16 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU16 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie620 分钟前
在IDEA中使用Git
java·git
Elaine20239135 分钟前
06 网络编程基础
java·网络
G丶AEOM36 分钟前
分布式——BASE理论
java·分布式·八股
落落鱼201337 分钟前
tp接口 入口文件 500 错误原因
java·开发语言
想要打 Acm 的小周同学呀38 分钟前
LRU缓存算法
java·算法·缓存
镰刀出海41 分钟前
Recyclerview缓存原理
java·开发语言·缓存·recyclerview·android面试
阿伟*rui3 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel