【六月更文打卡】Java多线程的面试题

103 阅读2分钟

多线程的面试题

一、线程的状态?

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;