Executor框架Executors工厂类

Posted 潜龙在渊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Executor框架Executors工厂类相关的知识,希望对你有一定的参考价值。

Executors 简介

Executors 是一个工厂类,其提供的是Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的实例的工厂方法;

  • 提供常用配置的 ExecutorService、ScheduledExecutorService的实现方法;
  • 创建并返回 ThreadFactory 的方法,它可将新创建的线程设置为已知的状态。
  • 将其他非Callable接口的其他类对象,封装成Callable,从而用于默些方法;

1. 封装非Callable对象

public static Callable<Object> callable(Runnable task)
返回 Callable 对象,调用它时可运行给定的任务并返回 null。
static <T> Callable<T> callable(Runnable task, T result):
返回 Callable 对象,调用它时可运行给定的任务并返回给定的结果。这在把需要 Callable 的方法应用到其他无结果的操作时很有用。
public static Callable<Object> callable(PrivilegedAction<?> action)
返回 Callable 对象,调用它时可运行给定特权的操作并返回其结果。
public static Callable<Object> callable(PrivilegedExceptionAction<?> action)
返回 Callable 对象,调用它时可运行给定特权的异常操作并返回其结果。
public static <T> Callable<T> privilegedCallable(Callable<T> callable)
返回 Callable 对象,调用它时可在当前的访问控制上下文中执行给定的 callable 对象。
public static <T> Callable<T> privilegedCallableUsingCurrentClassLoader(Callable<T> callable)
返回 Callable 对象,调用它时可在当前的访问控制上下文中,使用当前上下文类加载器作为上下文类加载器来执行给定的 callable 对象。

2. 创建并返回ExecutServic的常用配置实例对象

public static ExecutorService newSingleThreadExecutor()
创建一个使用单个 worker 线程的 Executor,以 无界队列 方式来运行该线程。如果这个线程死了,那么将会自动创建一个新的线程,继续完成任务。与其他等效的 newFixedThreadPool(1, threadFactory) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程,并在需要时使用提供的 ThreadFactory 创建新线程。其余同上。
public static ExecutorService newFixedThreadPool(int nThreads)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。
public static ExecutorService newFixedThreadPool(int nThreads,ThreadFactory threadFactory) 同上;
public static ExecutorService newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。缓存线程的任务队列是SynchronousQueue,而fix、single线程池则用的是无边界的LinkedBlockingQueue。
public static ExecutorService unconfigurableExecutorService(ExecutorService executor)
返回一个将所有已定义的 ExecutorService 方法委托给指定执行程序的对象,但是使用强制转换可能无法访问其他方法。这提供了一种可安全地“冻结”配置并且不允许调整给定具体实现的方法。

3. 创建并返回ScheduledExecutServic的常用配置实例对象

public static ScheduledExecutorService newSingleThreadScheduledExecutor()
创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。(线程终止了,也会自动重新创建,与上同)。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。其余同上。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个固定数量的线程池,它可安排在给定延迟后运行命令或者定期地执行
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize,ThreadFactory threadFactory)
同上;
public static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor)
返回一个将所有已定义的 ExecutorService 方法委托给指定执行程序的对象,但是使用强制转换可能无法访问其他方法。这提供了一种可安全地“冻结”配置并且不允许调整给定具体实现的方法。

4. 返回ThreadFactory

public static ThreadFactory defaultThreadFactory()
返回用于创建新线程的默认线程工厂;
public static ThreadFactory privilegedThreadFactory()
返回用于创建新线程的线程工厂,这些新线程与当前线程具有相同的权限。

ThreadFactory 接口

只有一个方法:
Thread newThread(Runnable r)
构造一个新 Thread。实现也可能初始化属性、名称、守护程序状态、ThreadGroup 等等。

此接口最简单的实现就是:

 class SimpleThreadFactory implements ThreadFactory {
   public Thread newThread(Runnable r) {
     return new Thread(r);
   }
 }

以上是关于Executor框架Executors工厂类的主要内容,如果未能解决你的问题,请参考以下文章

Executor框架

JDK多任务执行框架(Executor框架)

线程池工厂类

线程池工厂类

线程池

Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable