面试今典-Java中线程池-总结

54 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

我们来看看阿里开发规范中的怎么说的

  • 【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors 各个方法的弊端: 1)newFixedThreadPool 和 newSingleThreadExecutor: 主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至 OOM。 2)newCachedThreadPool 和 newScheduledThreadPool: 主要问题是线程数最大数是 Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至 OOM。

image.png

创建线程池的方式:

Executors.newSingleThreadExecutor(); 创建简单的线程池
Executors.newCachedThreadPool();  带有自动缓存的线程池
Executors.newScheduledThreadPool(10); 定时执行的线程池
Executors.newFixedThreadPool(2);  固定线程的线程池

分析线程池的7大参数 官方说的:

  1. @param corePoolSize 保留在池中的线程数
  2. @param maximumPoolSize 池中允许的最大线程数
  3. @param keepAliveTime 当线程数更大时与核心相比,这是多余的空闲线程在终止之前等待新任务的最长时间。
  4. @param unit {@code keepAliveTime} 参数的时间单位
  5. @param workQueue 用于在执行任务之前保存任务的队列。
  6. @param threadFactory 执行器创建新线程时使用的工厂
  7. @param handler 当执行被阻塞时使用的处理程序,因为达到了线程边界和队列容量

自定义线程池 核心线程数量怎么设定(最好在利用公司压测选择合理的数量)

  • CPU核心数*(1+CPU等待时间/每条线程的执行时间)

直接分析源码

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         threadFactory, defaultHandler);
}

image.png

  1. 柜台1-2-3  :核心线程数(3)corePoolSize
  2. 柜台1-2-3-4-5:最大线程数(5)
  3. 排队:等待队列 workQueue
  4. 拒绝策略:再来第6个客户直接拒绝:handler
  5. 定制化柜台业务:threadFactory
  6. unit :时间单位
  7. keepAliveTime  时间数值

一个一个脚印

文章持续更新 宝宝们