线程池的七大参数
- corePoolSize: 线程池中常驻核心线程数
- maximumPoolSize: 线程池中能够同时执行的最大线程数,此值必须大于等于1
- keepAliveTime: 多余的空闲线程的存活时间;当线程池数量抄错corePoolSize时,当空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下corePoolSize个线程为止
- unit: keepAliveTime的单位
- workQueue: 任务队列,被提交单尚未执行的队列
- threadFactory: 表示生成线程池中工作线程的线程工厂,用于创建线程,一般默认即可
- handler: 拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)是如何来拒绝
AbortPolicy(默认): 直接抛出RejectedExecutionException异常阻止系统的正常运行。
CallerRunsPolicy: "调用者运行"一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将默写任务退回到调用者。
DiscardOldestPolicy: 抛弃队列中等待最久的任务,然后把当前任务加入到队列中尝试再次提交当前任务。
DiscardPolicy: 直接丢弃任务,不予任何处理,也不抛出异常。如果允许任务丢失,这是最好的一种方案。
合理配置线程池
- CPU密集型任务配置尽可能少的线程数量:
该任务需要大量的运算,而没有阻塞,CPU一直全速运行。一般公式:CPU核数+1个线程的线程池 - IO密集型:
由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程,如CPU核数*2
IO密集型时,大部分线程都阻塞,故需要多配置线程数。参考公式:CPU核数/(1-阻塞系数) 阻塞系数在0.8~0.9之间。例如:8核/(1-0.9) = 80