Java 如何创建线程池?

1 答案

JAVA中创建线程池主要有两类方法。

一类是通过ThreadPoolExecutor类,该类提供7个构造参数,可根据需要来自定义一个线程池。

另一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用。

  1. newCachedThreadPool():创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程。
  2. newFixedThreadPool():创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待。
  3. newScheduledThreadPool():创建一个周期性的线程池,支持定时及周期性执行任务。
  4. newSingleThreadExecutor():创建一个单线程的线程池,可保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

这两类的区别和联系:

Executors类提供的4种方式,其底层其实都是通过ThreadPoolExecutor类来实现的。

换句话说,就是Executors类工厂通过参数的组合,组装出了上面提到的4种类型线程池供不同场景使用。

所以一般推荐通过ThreadPoolExecutor方式创建线程池,这样可以明确线程池的运行规则,规避资源耗尽的风险。

FixedThreadPoolSingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。

CachedThreadPoolScheduledThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

xiaobai xiaobai 6 月前 点赞 0