• J.U.C 系列 Tools之Executors


    上个章节说了Tools中的其他四个工具类,本节我们来看一看工具类中的老大Executors,为什么说它是老大,肯定是因为他的功能最多最强大。

    一 Executors是什么


    Executors 是一个线程池管理类,Executors为Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类提供了一些工具方法。Executors可以用于方便的创建线程池。

    这里面的Executor,ExecutorService,ScheduledExecutorService,ThreadFactory,Callable,ThreadPoolExecutor等我会放到下一章节来讲解,本节我们就只是了解Executors是什么,能做什么。

    二  Executors能做什么

    Executors是个工具类,它提供对Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的一些实用方法。
    此类支持以下各种方法:
        * 创建并返回设置有常用配置的ExecutorService的方法。
        * 创建并返回设置有常用配置的ScheduledExecutorService 的方法。
        * 创建并返回“包装的”ExecutorService 方法,它使特定于实现的方法不可访问,只让ExecutorService接口的方法可用。
        * 创建并返回 ThreadFactory 的方法,它可将新创建的线程设置为已知的状态。
        * 创建并返回非闭包形式的 Callable 的方法,这样可将其用于需要 Callable 的执行方法中。 
    下面重点来了:
    Executors大多数情况下都是被用来快速创建一个特色线程池。为什么说是特色,他把不同需求不同应用场景下所需的线程池通过一个newXXX()方法封装起来,内部自己去实现真正线程池的使用,这样用户(程序猿)就可以根据自己程序的应用场景自行选择调用那个Executors.newXX()方法,而不用去自己自定义线程池,自行调配参数。节约时间,提高效率,也更好地体现了,封装的特性。下面介绍一个常用的newXXX()
     
     newXXX()  描述  参数与返回值  源码  适用场景

    public static ExecutorService

    newFixedThreadPool

    (int nThreads);

    创建一个可重用固定线程数的线程池,

    以共享的无界队列方式来运行这些线程
      

    参数:n 池中的线程数 
    返回:新创建的线程池

    抛出:如果 nThreads <= 0.

    IllegalArgumentException

    如果 threadFactory 为 null

    NullPointerException -

     

    public static ExecutorService 
    newFixedThreadPool(
    int nThreads){ return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }

    适用于为了满足

    资源管理的需求,

    二需要限制当前线程

    数量的应用场景,

    适用于负载比较重

    的服务器

    public static ExecutorService

    newSingleThreadExecutor();

    创建一个使用单个 worker 线程的 

    Executor,以无界队列方式来运

    行该线程。 可保证顺序地执行

    各个任务,并且在任意给定的

    时间不会有多个线程是活动的。

    返回:新创建的单线程 Executor
     public static ExecutorService 
    newSingleThreadExecutor(){
    return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1,0L,
         TimeUnit.MILLISECONDS,
         new LinkedBlockingQueue<Runnable>())); }

    适用于需要保证

    顺序的执行各个任务,

    并且在任意时间

    点不会有多个

    线程活动的应用场景

    public static ExecutorService 

    newCachedThreadPool();

    public static ExecutorService 

    newCachedThreadPool

    (ThreadFactory f);


    创建一个可根据需要创建新线程的

    线程池,但是在以前构造的线程可

    用时将重用它们,并在需要时使用

    提供的 ThreadFactory创建新线程。

    参数:threadFactory - 

    创建新线程时使用的工厂 
    返回:新创建的线程池 
    抛出:NullPointerException

    如果 threadFactory 为 null

    public static ExecutorService 
    newCachedThreadPool(){
    return new ThreadPoolExecutor(0, Integer.
          MAX_VALUE,60L, 
          TimeUnit.SECONDS,
          new SynchronousQueue<Runnable>());
     }

    大小无界的线程池,

    适用执行很多短期

    异步任务的小程序

    或者负载较轻的服务器

    public static 

    ScheduledExecutorService 

    newSingleThread-

    ScheduledExecutor();

    创建一个单线程执行程序,

    它可安排在给定延迟后运行

    命令或者定期地执行。
     

    返回:新创建的安排执行程序
     
    public static ScheduledExecutorService 
    newSingleThreadScheduledExecutor() {
    return new DelegatedScheduledExecutorService (new ScheduledThreadPoolExecutor(1)); }
    适用于多个后台线程执行周期任务

     
    三  总结
     
      虽然Executors为我们提供了很多Executors.newXXX()方法,但是适用的使用一定要根据实际场景谨慎选择,必要时还是需要自定义ThreadPoolExecutor来实现程序功能,提高程序性能和效率。
     
     
     
     
    参考:《java并发编程的艺术》
    http://blog.csdn.net/hudashi/article/details/7012204
     

  • 相关阅读:
    24.redis持久化之AOF
    23.redis持久化之RBD
    22.redis五大类型常用的方法
    21.ssm框架--详细整合教程(Spring+SpringMVC+Mybatis)
    20.Mybatis之逆向工程
    Maven环境静态资源问题
    db.properties配置文件
    logo4j配置文件
    mybatis-config.xml系统核心配置文件
    注解
  • 原文地址:https://www.cnblogs.com/zabulon/p/5836361.html
Copyright © 2020-2023  润新知