面试官:你知道创建线程的方式有哪些吗?
派大星:主要有两种方式,
面试官:很好。你能说一下这些创建方式的优缺点吗?
派大星:当然。但是我要先提醒一下,不建议使用 Executors 创建线程。
FixedThreadPool 和 SingleThreadPool 允许的请求队列长度为 Integer.MAX_VALUE,从而可能会堆积大量请求,造成 OOM;CachedThreadPool 和 ScheduledThreadPool 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。除此之外,Executors 创建的线程池无法自定义配置,不够灵活。建议使用 ThreadPoolExecutorPools创建方式进行自定义配置面试官:你能介绍一下 Executors 吗?
派大星:Executors 是一个工具类,提供了创建线程池的方法。它提供了 6 种创建线程池的方式,包括 newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool 等。
面试官:那你能介绍一下 newFixedThreadPool 的使用方法吗?
派大星:当然可以。newFixedThreadPool 可以创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待。我们可以通过以下代码来创建一个固定大小的线程池:
ExecutorService threadPool = Executors.newFixedThreadPool(2);
面试官:那你能介绍一下 Executors 提供的其他创建方式吗?
派大星:当然可以。除了 newFixedThreadPool,Executors 还提供了其他 5 种创建方式,分别是 newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool、newSingleThreadScheduledExecutor 和 newWorkStealingPool。
面试官:这些创建方式有什么优缺点呢?
派大星:这些创建方式各有优缺点。例如
面试官:那你建议我们使用哪种创建方式呢?
派大星:我建议使用 ThreadPoolExecutorPools 创建方式进行自定义配置。因为 Executors 创建方式的缺点是无法进行自定义配置,而 ThreadPoolExecutorPools 可以通过自定义配置来满足不同的需求。
面试官:你知道线程池的参数有哪些吗?
派大星:一共有七个参数。
所以综上情况所述,我们推荐使用 ThreadPoolExecutor 的方式进行线程池的创建,因为这种创建方式更可控,并且更加明确了线程池的运行规则,可以规避一些未知的风险。