【627、项目中是如何创建线程池的,什么不用Executors 去创建线程池】

57 阅读2分钟

在线程池的创建方面,使用 Executors 创建线程池是比较常见的方法,但是它也存在一些问题。Executors 提供了一些静态方法来创建不同类型的线程池,比如 newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool 等,这些方法都返回一个 ExecutorService 对象,我们可以通过该对象来管理线程池。

然而,使用 Executors 创建线程池存在以下几个问题:

  1. 线程池的队列可能会无限制增长:Executors 提供的线程池默认使用无界的任务队列,如果任务提交速度大于任务执行速度,那么队列中的任务会一直增加,最终可能导致内存溢出。
  2. 线程池可能会创建过多的线程:Executors 创建的线程池使用的是默认的线程工厂和拒绝策略,无法自定义,如果线程池中的线程都在执行任务,那么新任务会被放在任务队列中等待执行,如果队列已满,那么就会创建新的线程来处理任务,如果这样一直持续下去,就会导致线程池中的线程数量过多,最终可能导致系统崩溃。
  3. 线程池无法定制化:Executors 提供的线程池默认使用的是一些固定的参数,如果我们需要定制化线程池的参数,比如修改线程池的大小、拒绝策略等,就无法实现。

因此,在实际项目中,为了避免上述问题,一般不建议直接使用 Executors 创建线程池,而是需要手动创建线程池,使用 ThreadPoolExecutor 或 ScheduledThreadPoolExecutor 来创建线程池,并根据实际情况来定制线程池的参数,比如线程池的大小、任务队列的大小、拒绝策略等。这样可以更好地控制线程池的行为,避免出现问题。