Executors 类中定义了Executor、ExecutorService、ScheduledExecutorService、ThreadFactory和Callable类的工厂方法和实用方法。这个类支持以下几种方法:
一、此类中方法简介
1.创建各种线程池的静态方法,返回值为ExecutorService
方法 | 描述 |
newCachedThreadPool() | 创建一个缓存线程池,线程池内的线程会存活60s |
newCachedThreadPool(ThreadFactory threadFactory) | 使用指定的工厂类,创建一个缓存线程池,线程池内的线程会存活60s |
newFixedThreadPool(int nThreads) | 创建一个固定数量线程的线程池 |
newFixedThreadPool(int nThreads, ThreadFactory threadFactory) | 使用指定的工厂类,创建一个固定数量线程的线程池 |
newSingleThreadExecutor() | 创建一个线程的线程池 |
newSingleThreadExecutor(ThreadFactory threadFactory) | 使用指定的工厂类,创建一个线程的线程池 |
2.创建各种线程池的静态方法,返回值为ScheduledExecutorService
方法 | 描述 |
newScheduledThreadPool(int corePoolSize) | 创建一个线程池,该线程池可以调度命令在给定延迟后运行或定期执行 |
newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) | 使用指定的工厂类,创建一个线程池,该线程池可以调度命令在给定延迟后运行或定期执行 |
newSingleThreadScheduledExecutor() | 创建一个单线程执行器,该执行器可以安排命令在给定延迟后运行或定期执行 |
newSingleThreadScheduledExecutor(ThreadFactory threadFactory) | 使用指定的工厂类,创建一个单线程执行器,该执行器可以安排命令在给定延迟后运行或定期执行 |
3.创建并返回一个ThreadFactory,该ThreadFactory将新创建的线程设置为已知状态
返回值 | 方法 | 描述 |
static ThreadFactory | defaultThreadFactory() | 返回一个默认的线程工厂类用来创建新线程 |
static ThreadFactory | privilegedThreadFactory() | 返回一个线程工厂,该线程工厂用于创建具有与当前线程相同权限的新线程,privilegedThreadFactory类继承了defaultThreadFactory类 |
4.从其他类似闭包的表单中创建并返回一个Callable的方法,因此它们可以用于需要Callable的执行方法
返回值 | 方法 | 描述 |
static Callable<Object> | callable(PrivilegedAction<?> action) | 返回一个Callable对象,该对象在被调用时运行给定的特权操作并返回其结果 |
static Callable<Object> | callable(PrivilegedExceptionAction<?> action) | 返回一个Callable对象,该对象在被调用时运行给定的特权异常操作并返回其结果 |
static Callable<Object> | 返回一个Callable对象,该对象在被调用时运行给定的任务并返回null | |
static <T> Callable<T> | callable(Runnable task, T result) | 返回一个Callable对象,该对象在被调用时运行给定的任务并返回给定的结果 |
二、不建议使用Executors的原因
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,避免资源耗尽的风险。Executors各个方法的弊端:
1. newSingleThreadExecutor和newFixedThreadPool:主要问题是对接的请求处理队列可能会耗费非常大的内存,甚至OOM
2.newCachedThreadPool和newScheduledThreadPool:主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,设置OOM
三、Executor接口
接口中只有一个execute方法,此接口是所有线程池的鼻祖