java线程池导哪个包_Java线程池ThreadPoolExecutor面试总结思维导图速记

优点

降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

提高响应速度,当任务到达时,可以不需要等待线程创建就能立即执行。

提高线程的可管理性

类关系

接 Executor 一个无返回值的execute方法

接 ExecutorService 返回值为Future类型的submit方法

类 AbstractExecutorService

类 ThreadPoolExecutor

创建

ThreadPoolExecutor类

包含参数

corePoolSize: 核心线程数最大值

maximumPoolSize: 最大线程数大小

keepAliveTime: 非核心线程空闲的存活时间大小

unit: 线程空闲存活时间单位

workQueue: 存放任务的阻塞队列

threadFactory: 用于设置创建线程的工厂

handler: 线城池的饱和策略事件

参数workQueue有如下几种队列

ArrayBlockingQueue; 必须带参构造,数组,默认非公平可指定,FIFO

LinkedBlockingQueue; 可带参构造,大小默认int最大,FIFO

SynchronousQueue;不存储元素,每个插入操作必须等到另一个线程调用移除操作,否则堵塞

PriorityBlockingQueue;优先级,数组

DelayQueue; 基于PriorityQueue,延时阻塞队列,只有当其指定的延迟时间到了,才能够从队列中获取到该元素。

参数hander有如下几种

AbortPolicy 丢弃任务并抛异常,默认

DiscardPolicy 直接丢弃任务

DiscardOldestPolicy 丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)

CallerRunsPolicy 由调用线程处理该任务

Executors类

阿里巴巴开发规范不允许使用Executors去创建,因为队列OOM。

主要有如下几种

newCachedThreadPool():一个任务创建一个线程,使用SynchronousQueue,用于并发执行大量短期的小任务。

newFixedThreadPool(nThreads):所有任务使用固定大小的线程池,使用LinkedBlockingQueue,适用执行长期的任务

newSingleThreadExecutor():只有一个线程的线程池,使用LinkedBlockingQueue,适用于串行执行任务的场景,

执行流程

在 execute() 中实现,当提交一个线程时

如果正在运行的线程数 < coreSize,马上创建线程执行该task,不排队等待;

如果正在运行的线程数 >= coreSize,把该task放入队列;

如果队列已满 && 正在运行的线程数 < maximumPoolSize,创建新的线程执行该task;

4 . 如果队列已满 && 正在运行的线程数 >= maximumPoolSize,线程池调用handler的reject方法拒绝本次提交。

异常捕获

默认不捕获异常,捕获方法如下

try-catch

submit执行,Future.get接受异常

重写ThreadPoolExecutor的afterExecute方法,处理传递的异常引用

为工作者线程设置UncaughtExceptionHandler,在uncaughtException方法中处理异常

线程池状态

running

该状态的线程池会接收新任务,并处理阻塞队列中的任务;

shutdown() -> shutdown

shutdownNow() -> stop

shutdown

该状态的线程池不会接收新任务,但会处理阻塞队列中的任务;

队列为空,并且线程池中执行的任务也为空,进入tidying状态;

stop

该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;

线程池中执行的任务为空,进入tidying状态;

tidying

该状态表明所有的任务已经运行终止,记录的任务数量为0。

terminated() -> terminated

terminated

该状态表示线程池彻底终止

线程大小设置

如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 N(cpu) + 1

如果是IO密集型任务,参考值可以设置为2 * N(cpu)

思维导图(右键另存为下载)

5e4c25ee914c77ce4960e45f92895593.png

喜欢可以点个赞,感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值