多线程的面试题
一、线程的状态?
1、新建状态:new一个线程,没还有start
2、运行状态(就绪和运行):调用线程的.start方法
1)就绪,调用了start方法,CPU没有分配时间片
2)运行,调用了start方法,CPU正在调度3、阻塞状态:当竞争synchronized锁时,没拿到,线程挂起4、等待状态:join,wait,(LockSupport)park方法5、超时等待状态:Thread.sleep(long),wait(long),join(long),parkNanos(……)6、死亡状态:run方法结束,或者在run方法中抛出异常没有
二、线程池核心参数
Java中提供了基于Executors构建线程池的方式
直接使用Executors构建会造成对线程池的控制力度很粗
必须以手动的方式构建线程池
public ThreadPoolExecutor(int corePoolSize, // 核心线程、
int maximumPoolSize, // 最大线程有存活时间
long keepAliveTime, // 生存时间、
TimeUnit unit, // 单位、
BlockingQueue<Runnable> workQueue, //任务队列
ThreadFactory threadFactory, // 线程工厂、为了设置线程的名称,方便后面做调试
RejectedExecutionHandler handler) {} // 拒绝策略
三、线程池的执行流程
提交任务到线程池中,让线程池中的线程去执行任务
1、提交任务到线程池后
· 如果有空闲的核心线程,直接执行
· 如果没有空闲的核心线程,尝试创建核心线程,去执行任务
2、如果已经达到了核心线程数配置
将任务扔到任务队列中排队,等待核心线程执行完其他任务再来执行我
3、 如果任务队列满了放不下任务了,构建最大线程数
4、 如果最大线程也已经构建满了,执行拒绝策略
四、线程池中的ctl属性什么用?
ctl是线程池中一个属性,本质就是int类型的数值
高3位描述线程池的状态,低29位描述工作线程的数量
线程池在执行任务时,需要多次判断线程池状态,来确实任务是否需要执行(以哪种方式执行)
低29用表述线程池中现存的工作线程数量
五、线程池的状态?
// RUNNING-线程池在正常工作,可以处理提交的任务!!!
private static final int RUNNING = -1 << COUNT_BITS;
// 调用线程池的shuwdown()方法,从RUNNING -> SHUTDOWN ,不接收新的任务,但是会处理线程池内部现有的任务包括队列
private static final int SHUTDOWN = 0 << COUNT_BITS;
// 调用线程池的shuwdownNow()方法,从RUNNING -> STOP ,不接收新的任务,中断正在处理的任务,不管工作队列任务
private static final int STOP = 1 << COUNT_BITS;
// 过渡状态,会从SHUTDOWN和STOP转到TIDYING状态
// SHUTDOWN - 工作队列为空,工作线程为空 - TIDYING
// STOP - 工作线程为空 - TIDYING
private static final int TIDYING = 2 << COUNT_BITS;
// 当线程池达到了TIDYING后,源码中会自动调用terminated,进入到了TERMINATED状态,线程池凉凉
private static final int TERMINATED = 3 << COUNT_BITS;