1. 先来看一下类构成

public interface Executor {   //顶级接口Executor,定义了线程执行的方法

    void execute(Runnable command);
}
public interface ExecutorService extends Executor {
  //定义了线程池周期相关的方法
    void shutdown();         //平缓的关闭:不再接受新的任务,同时等待已经提交的任务的完成(包括还未开始执行的任务)

    List<Runnable> shutdownNow();  //粗暴的关闭,尝试取消正在执行的任务,同时不再继续执行提交但未开始的任务

    boolean isShutdown();       //查看该执行器是否关闭

    boolean isTerminated();    //查询线程池是否终止

    boolean awaitTermination(long timeout, TimeUnit unit)  //等待线程池达到终止状态,通常在此方法后调用shutdown()达到同步关闭线程池的效果
        throws InterruptedException;

    <T> Future<T> submit(Callable<T> task);              //submit()方法用来提交带有返回值的任务

    <T> Future<T> submit(Runnable task, T result);

    Future<?> submit(Runnable task);

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)    //用来提交复数的任务
        throws InterruptedException;

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                                  long timeout, TimeUnit unit)
        throws InterruptedException;

    <T> T invokeAny(Collection<? extends Callable<T>> tasks)
        throws InterruptedException, ExecutionException;

    <T> T invokeAny(Collection<? extends Callable<T>> tasks,
                    long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

2. ThreadPoolExecutor为线程池的实现

public ThreadPoolExecutor(int corePoolSize,       //核心线程数量,代表在空闲状态下线程池中维持的线程的数量
                              int maximumPoolSize,   //线程池所能允许的最大线程数量
                              long keepAliveTime,  //空闲线程的存活时间
                              TimeUnit unit,    //时间单位
                              BlockingQueue<Runnable> workQueue,  //用来暂时保存任务的队列
                              ThreadFactory threadFactory,      //用来创建线程
                              RejectedExecutionHandler handler) {   //拒绝策略,在任务无法加入到队列是发挥作用

    }

3. 拒绝策略

  (1)AbortPolicy: 该策略抛出RejectedExecutionException,调用者捕获异常后进行处理。

  (2)DiscartPolicy:当新任务无法加入到队列中是,该策略悄悄抛弃该任务。

  (3)DiscardOldestPolicy:该策略将抛弃即将要执行的任务。

  (4)CallerRunsPolicy:该策略将某些任务回退到调用者。

4. 四种类型的线程池(通用线程池的方法定义在Executors类中)

  当线程池的所有参数有效设置时提交任务的完整过程:查看当前线程数量是否大于corePoolSize,若小于则创建一个新的线程来执行该任务,否则将该任务加入到workQueue中;若workerQueue也满,那么查看线程的数量是否小于maximumPoolSize,若小于则创建新的线程来执行,否则执行抛弃策略。另外若线程空闲时间大于keepAliveTime,则销毁线程。

 public ThreadPoolExecutor(int corePoolSize,            //通用构造方法
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);      //使用默认的线程工厂和默认的拒绝策略
    }
private static final RejectedExecutionHandler defaultHandler =        //默认为AbortPolicy    new AbortPolicy(); 
 

  (1)newFixedThreadPool :创建一个固定大小的线程池

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,       //核心数量=最大数量,keepAliveTime=0(若无以外线程将一直存在),workQueue使用LinkedBlockingQueue
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {   //另一个构造方法,可指定线程工厂    return new ThreadPoolExecutor(nThreads, nThreads,                                  0L, TimeUnit.MILLISECONDS,                                  new LinkedBlockingQueue<Runnable>(),                                  threadFactory);}
 
 

  (2)newCachedThreadPool:创建一个可更具需要的线程池

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,    //核心大小=0,最大数量不限,存活时间为60s(若长时间没有任务则该线程池为空),使用SynchronousQueue作为workeQueue
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

  (3)newScheduledThreadPool:创建一个可延迟执行任务的线程池

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
 public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,   //指定核心大小,不限最大数量,线程不会过期,使用DelayedWordeQueue作为workeQueue
              new DelayedWorkQueue());
    }

  (4)newSingleThreadPool:创建一个只有一个线程的线程池

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,         //核心数量与最大数量都为1,存活时间不限,使用LinkedBlockingQueue作为workQueue
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

java线程池的介绍与使用(Executor框架)的更多相关文章

  1. Java 线程池的介绍以及工作原理

    在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1. 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗.2. 提高响应速度: ...

  2. Java 线程池详细介绍

    根据摩尔定律(Moore’s law),集成电路晶体管的数量差不多每两年就会翻一倍.但是晶体管数量指数级的增长不一定会导致 CPU 性能的指数级增长.处理器制造商花了很多年来提高时钟频率和指令并行.在 ...

  3. Java线程池管理及分布式Hadoop调度框架搭建

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发工程师却在这个上面吃了不少苦头. 怎么做一套简便的线程开发模 ...

  4. Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析

    目录 引出线程池 Executor框架 ThreadPoolExecutor详解 构造函数 重要的变量 线程池执行流程 任务队列workQueue 任务拒绝策略 线程池的关闭 ThreadPoolEx ...

  5. 深入理解Java线程池:ThreadPoolExecutor

    线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线 ...

  6. Java线程池使用和源码分析

    1.为什么使用线程池 在多线程编程中一项很重要的功能就是执行任务,而执行任务的方式有很多种,为什么一定需要使用线程池呢?下面我们使用Socket编程处理请求的功能,分别对每种执行任务的方式进行分析. ...

  7. (转载)JAVA线程池管理

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  8. Java线程池的那些事

    熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...

  9. java线程池的注意事项

    java线程池是建立一个技术进步的线程.到来之前线程池打造一批在线程的线程尚未,队列上的备用,然后再利用这些资源.减少频繁创建和销毁对象, 1.jdk1.5以上提供了现成的线程池 2.java线程池的 ...

  10. Java 线程池(一):开篇及Executor整体框架介绍

    一.开篇 线程池.数据库连接池,在平时的学习中总能接触到这两个词,但它们到底是什么?和线程,数据库连接有什么关系?为什么需要“池”?“池”的概念及作用是什么?要弄清楚这些问题,就要深入到“池”的实现中 ...

随机推荐

  1. 用Fiddler的自动响应模拟系统集成

    1. 下载最新版本的Fiddler Fiddler 官网 2, 安装并启动Fiddler 3, 勾选自动响应 见上图 4, 添加自动响应规则 见上图 5, 添加自动响应内容文件 添加响应文件到Fidd ...

  2. 【C语言学习趣事】_32_平胸的尴尬,嫁不出去的姑娘

    为什么写这篇文章呢? 为什么要弄这么个题目呢? 首先解释为什么用这个题目.这一切都要从那天在QQ群中的讨论说起,那天在群中,一个哥们问了一个关于(void)0 的问题.然后大家说到了 (void)0和 ...

  3. 解决SQL Server的cannot resolve the collation conflict问题

    当没有牵涉到两个不同的数据库时,出现以上错误.   Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" ...

  4. Asp.net操作Excel----NPOI!!!!1

    前言 Asp.net操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使 用NPOI能够帮助开发者在没有安装微软Office的情况下读写Off ...

  5. (转)TCP协议那些事

    (上) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是 ...

  6. 在 CentOS 中编译安装 VIM 7.3

    转载:http://blog.csdn.net/zhanglyung/article/details/6204574 默认安装的 Vim 不带有多字符支持,所以不支持中文.无论是将 CentOS 本来 ...

  7. vue登录拦截

  8. 通过IDEA搭建scala开发环境开发spark应用程序

    一.idea社区版安装scala插件 因为idea默认不支持scala开发环境,所以当需要使用idea搭建scala开发环境时,首先需要安装scala插件,具体安装办法如下. 1.打开idea,点击c ...

  9. QT之setting注册表项

    1.头文件 #include <QSettings> 2.read注册表项 void MainWindow::readSettings() // 读取窗口设置 { QSettings se ...

  10. C语言 —— sprintf()函数

    sprintf() 函数 例如: #include<stdio.h> int main() { //注意s一定要先初始化! *sizeof(char)); //或char s[40]; s ...