上个章节说了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
 

J.U.C 系列 Tools之Executors的更多相关文章

  1. J.U.C 系列之 Tools

    JDK 5.0 开始,java并发大师Doug lea 为我们带来了更高效更应用的java并发API Java.util.concurrent包,简称J.U.C J.U.C 体系由如下五个知识结构构成 ...

  2. j.u.c系列(11)---之并发工具类:Exchanger

    写在前面 前面三篇博客分别介绍了CyclicBarrier.CountDownLatch.Semaphore,现在介绍并发工具类中的最后一个Exchange.Exchange是最简单的也是最复杂的,简 ...

  3. j.u.c系列(06)---之锁条件:Condition

    写在前面 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait().notify()系列方法可以实现等待/通知模式.在Java SE5后,Java提供了Lock接 ...

  4. j.u.c系列(03)---之AQS:AQS简介

    写在前面 Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchron ...

  5. j.u.c系列(02)---线程池ThreadPoolExecutor---tomcat实现策略

    写在前面 本文是以同tomcat 7.0.57. jdk版本1.7.0_80为例. 线程池在tomcat中的创建实现为: public abstract class AbstractEndpoint& ...

  6. j.u.c系列(01) ---初探ThreadPoolExecutor线程池

    写在前面 之前探索tomcat7启动的过程中,使用了线程池(ThreadPoolExecutor)的技术 public void createExecutor() { internalExecutor ...

  7. Day9 - J - 吉哥系列故事——恨7不成妻 HDU - 4507

    单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 77=7 ...

  8. j.u.c系列(10)---之并发工具类:Semaphore

    写在前面 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可:当信号量中有可用的许可 ...

  9. j.u.c系列(09)---之并发工具类:CyclicBarrier

    写在前面 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).因为该 barrier 在释放等待线程后可以重用,所以 ...

随机推荐

  1. 夜色的 cocos2d-x 开发笔记 03

    本章添加敌人,首先我们在.h文件里添加新的方法 之后进入.cpp文件,写出方法内容 当然还要调用一次,我把这个方法添加在了这里,也就是和发子弹是同步的,当然想要多久调用一次大家可以自己调整 运行一下 ...

  2. Azure CDN:氮气加速已开启,司机们请做好准备

    在上一周,我们向各位小伙伴介绍了通过 Azure CDN 高级版服务为 HTTPS 应用加速的做法,漏掉的小伙伴可以点击这里穿越回去补课哦.那我们今天讲点什么呢?当然是 CDN 最重要的价值:改善应用 ...

  3. 谁动了我的I/O?

    首先,是信用卡账单欠款0.13美刀~~~然后上亚马逊云查了一下账单. 3M次I/O...(1215133次超额的,2000000次免费的.) 于是监控了一下数据:每秒至少写5次,每秒写300KB,平均 ...

  4. JavaScript 闭包的详细分享(三种创建方式)(附小实例)

    JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...

  5. SIEMENS Simotion 运动控制器设置Web service, HTTP, FTP访问密码

    早期版本的web service, 访问密码是 用户名 : simotion 密码 : simotion 新版本,Firmware >= 4.4之后,考虑到安全性,控制器没有默认密码.设置密码方 ...

  6. vue中的js动画与Velocity.js结合

    vue里面除了用css写动画,还可以用js写动画,vue的transition中,定义了几个动画钩子 第一个动画钩子:@before-enter <div id='app'> <tr ...

  7. Breaking Biscuits(模板题-求凸边形的宽)

    Breaking Biscuits 时间限制: 1 Sec  内存限制: 128 MB  Special Judge提交: 70  解决: 26[提交] [状态] [讨论版] [命题人:admin] ...

  8. 关于img底部空白

    <img>元素底部为何有空白? 问题: 最近听网课遇到这样一个问题,先po出代码如下: <!--html--> <div class="top"> ...

  9. 模拟ie9的placeholder

    ie9 的input框没有placeholder属性 啧啧啧~~~ 所以就用span标签来模拟一下 先判断浏览器类型 if(navigator.useAgent.indexOf("MSIE ...

  10. JNDI整理

    JNDI 什么是JNDI JNDI全称为Java Naming and Directory Interface,命名及目录查找接口,是java平台的一种标准扩展,它提供了一系列接口.类和命名空间的概念 ...