当前位置:网站首页>使用Executors类快速创建线程池

使用Executors类快速创建线程池

2022-04-23 14:07:00 pureluckyfish


       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(Runnable task)

返回一个Callable对象,该对象在被调用时运行给定的任务并返回null
static <T> Callable<T> callable(Runnable task, T result) 返回一个Callable对象,该对象在被调用时运行给定的任务并返回给定的结果

 二、不建议使用Executors的原因

        线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,避免资源耗尽的风险。Executors各个方法的弊端:

        1. newSingleThreadExecutornewFixedThreadPool:主要问题是对接的请求处理队列可能会耗费非常大的内存,甚至OOM

        2.newCachedThreadPoolnewScheduledThreadPool:主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,设置OOM  

三、Executor接口

        接口中只有一个execute方法,此接口是所有线程池的鼻祖

版权声明
本文为[pureluckyfish]所创,转载请带上原文链接,感谢
https://blog.csdn.net/sinat_33918956/article/details/118568910