10、为什么要使用线程池

   统一管理资源   节省了资源的开销(不需要重复的创建和销毁)


11、线程池的执行流程

   1、判断线程池中是否有核心线程 如果有直接使用核心线程执行任务

   2、判断队列是否已满,如果没有满进入到队列中排队

   3、如果队列满了使用非核心线程执行任务

   4、如果非核心线程也满了 直接执行拒绝策略


12、线程池的核心参数

   1、核心线程数

   2、最大线程数 = 非核心线程数+核心线程数

   3、非核心线程的存活时间  

   4、非核心线程的存活时间单位

   5、队列

   6、拒绝策略

   7、线程工厂


13、线程池的拒绝策略有哪些

   1. AbortPolicy:(默认) 丢弃任务并抛出RejectedExecutionException异常

   2. DiscardPolicy:丢弃任务,但是不抛出异常

   3. DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务

   4. CallerRunsPolicy:只要线程池没有关闭,就由提交任务的当前线程处理


14、了解 Executors 创建线程池吗

 我知道它是可以创建线程池的,但是我们项目中不用

 项目中用的是Spring带的那个ThreadPoolTaskExecutor



15、如何确定线程池的核心线程数

   取决于任务是CPU密集型还是IO密集型

   CPU密集型:服务器的核数

   IO密集型: 服务器的核数*2


16、CountDownLatch 的作用是什么

    可以控制一些线程执行完成后再执行其他的业务


17、 volatile 关键字的作用是什么

  volatile保证线程之间数据可见

  可以防止指令重排