线程池
2021-11-21 19:46:02 0 举报
AI智能生成
java线程池作用,状态,参数,常见面试问题
作者其他创作
大纲/内容
作用
重用线程,减少线程创建和销毁的开销
提高系统响应速度,任务不需要等到线程创建再执行
提高线程的可管理性,对线程资源进行统一的分配和管理,控制线程创建数量和并发数
状态
int的高3位用来保存状态,低29位保存工作线程数,状态值越往后越大
running: 线程池刚被创建时的状态,可以接收新任务和执行已提交的任务
shutdown:调用shutdown()后的状态,
可以执行已存在的任务
不能提交新任务,执行拒绝策略
阻塞队列为空时,工作线程会退出,不再阻塞获取任务
stop:调用shutdownNow()的状态
不接受新任务
会中断所有启动的工作线程
清空阻塞队列
tidying:是一个过渡状态
shutdown->tidying条件:阻塞队列为空,工作线程为0
stop->tidying条件:工作线程为0
TERMINATED:处于tidying状态后,会执行terminate钩子方法,执行完后,转为terminated
参数
corePoolSize:核心线程数
当工作线程数小于核心线程数时,每来一个任务都会新建一个线程去执行该任务;
当工作线程数大于等于核心线程数时,新提交的任务会放进阻塞队列中,直到被空闲线程获取执行
maximumPoolSize:最大线程数,当阻塞队列放满时,线程池所能创建的最大线程数
keepAliveTime:阻塞队列为空时,非核心线程等待的最大时间
handler:任务拒绝策略
触发策略
线程池达到最大线程数
线程池不为running时
种类
CallerRunsPolicy
提交任务的线程执行
AbortPolicy
默认策略,抛RejectedExecutionException
DiscardPolicy
不做处理
DiscardOldestPolicy
丢弃阻塞队列头部的任务,重新执行任务
常见问题
线程池是如何实现线程复用的
是如何区分核心线程与非核心线程
工作线程如何实现
封装了线程和任务对象,实现了Runnable接口,对任务的执行进行代理,从而实现线程复用
继承了AQS,实现了不可重入的独占锁,用来判断工作线程是否空闲
任务抛异常时,会发生什么
异常会被抛出
执行任务的线程会结束,并且补偿一个线程进去
0 条评论
下一页