文章预览
1. 正确声明线程池 线程池必须手动通过 ThreadPoolExecutor 的构造函数来声明,避免使用 Executors 类创建线程池,会有 OOM 风险。 Executors 返回线程池对象的弊端如下(后文会详细介绍到): FixedThreadPool 和 SingleThreadExecutor :使用的是无界的 LinkedBlockingQueue ,任务队列最大长度为 Integer.MAX_VALUE ,可能堆积大量的请求,从而导致 OOM。 CachedThreadPool :使用的是同步队列 SynchronousQueue , 允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致 OOM。 ScheduledThreadPool 和 SingleThreadScheduledExecutor : 使用的无界的延迟阻塞队列 DelayedWorkQueue ,任务队列最大长度为 Integer.MAX_VALUE ,可能堆积大量的请求,从而导致 OOM。 说白了就是: 使用有界队列,控制线程创建数量。 除了避免 OOM 的原因之外,不推荐使用 Executors 提供的两种快捷的线程池
………………………………