面试官:
    创建创建线程有几种方式?
    我:
    有4种。
    一、继承Thread类,重写run方法。
    二、实现Runnable接口,重写run方法。只能抛出运行时异常,不能捕获处理。
    三、实现Callable接口,重写Call方法。支持泛型,可以获得线程执行结果的返回值,并且可以抛出异常和捕 获处理。
    四、使用线程池创建。
    面试官:
    start 方法和run方法的区别?
    我:
    调用start方法可以启动线程,并且使得线程进入就绪状态,而run方法只是thread的一个普通方法,还是在主线程中执行。
    面试官:
    线程的状态有哪些?
    我:
    1591163781941.png
    看图说话。
    面试官:
    那你再说说线程池。
    我:😒
    首先说说线程池的核心参数嘛。七大参数四大拒绝策略。我们可以根据不同的也不场景运用不同的线程池。 常用的如下:
    newCachedThreadPool 缓存线程池 用来处理耗费时间短的任务 核心线程数0,空闲线程数可以扩大到 2^31-1,但空闲时间超过60S会被杀死,任务队列不存值,用来中转和传递任务。
    newFixedThreadPool 可重用固定线程数的线程池 用来控制并发数量。核心线程数=最大线程数。
    newSingleThreadExecutor 只有一个线程在里面,用来按顺序执行任务。

    newSingleThreadScheduledExecutor:创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期执行
    newScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行命令或者定期的执行

    newWorkStealingPool:创建一个带并行级别的线程池,并行级别决定了同一时刻最多有多少个线程在执行,如不传并行级别参数,将默认为当前系统的CPU个数

    面试官:
    线程池流程了解一下?
    我:
    🙂
    image.png
    线程过来后,判断的是核心线程满没满,满了就进入队列。队列满了再看核心线程满没满,满了才创建空闲线程,没满就让核心线程去执行,

    四大拒绝策略:前三者都会丢弃任务 一是丢弃并报异常,二丢弃不报异常,三丢弃等待时间最长的任务。最后的既不丢弃也不抛异常而是将任务退给调用者,让调用者去执行。