关于线程池的几个问题

问:为什么很多 Java 规范都建议不要显式的创建 Thread,而使用线程池?

答:因为使用线程池的好处是减少在创建和销毁线程上所消耗的时间和系统资源,解决资源不足的问题,如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者过渡切换问题。

问:为什么不建议在代码中直接使用 Executors 创建线程池,而是推荐通过 ThreadPoolExecutor 方式创建?

答:其实不直接使用工具类的目的只有一个,那就是可以明确的让我们知道线程池的运行规则,避免使用工具类的包装而不够直观内部机制而导致潜在的问题。譬如使用 Executors 的 FixedThreadPool 和 SingleThreadPool 创建线程池的原理都允许请求的队列长度为 Integer 的最大值,这样的话可能会堆积大量的请求导致 OOM;而使用 Executors 的 CachedThreadPool 和 ScheduledThreadPool 创建线程池的原理都允许创建线程数量为 Integer 的最大值,这样的话可能会导致创建大量的线程而导致 OOM,所以推荐直接通过明确的构造参数创建线程池,这样就相当与时刻提醒自己的线程池特性是什么。

你可能感兴趣的:(关于线程池的几个问题)