并发编程学习---Executor框架

目录

  • 简介
  • Executor框架的两级调度模型
  • Executor框架的组成
  • ExecutorService生命周期
  • Executors工具类介绍

1. 简介

在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。

2. Executor框架的两级调度模型

在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收。操作系统会调度所有线程并将它们分配给可用的CPU。

在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上
并发编程学习---Executor框架_第1张图片

3. Executor框架的组成

  1. 任务
  2. 任务的执行
  3. 异步计算的结果

3.1 任务

接口 说明
Runnable 不带返回值的异步线程接口
Callable 带返回值的异步线程接口

3.2 任务的执行

接口 说明
Executor 它是Executor框架的基础,提供了execute()线程运行接口
Executors 定义了不同类型的线程池创建的通用接口
ThreadPoolExecutor 是线程池的核心实现类,用来执行被提交的任务
ScheduledThreadPoolExecutor 是一个实现类,可以在给定的延迟后运行命令,或者定期执行命令。

3.3 异步计算的结果

接口 说明
Future 获取异步线程Callable的返回值
FutureTask 实现Future接口

4. ExecutorService生命周期

  • 运行 执行了 execute或者submit方法
  • 关闭 执行了shutdown方法
  • 终止 所有线程运行完成

5. Executors工具类介绍

5.1 定长线程池 newFixedThreadPool(int nThreads)

源码:

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

特征:

  • 核心线程数和最大线程数相同
  • 当线程池中的线程数大于corePoolSize时,空闲线程立即被终止
  • 使用无界队列LinkedBlockingQueue作为线程池的工作队列,运行中的FixedThreadPool不会拒绝任务

5.2 单例线程池newSingleThreadExecutor()

源码:

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
}

特征:

  • 如果当前运行的线程数少于corePoolSize(即线程池中无运行的线程),则创建一个(也仅有一个)新线程来执行任务
  • 空闲线程会立即终止
  • 使用无界队列LinkedBlockingQueue作为线程池的工作队列,运行中的FixedThreadPool不会拒绝任务

5.3 可缓存线程池newCachedThreadPool()

源码:

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

特征:

  • 最大可以创建Integer.MAX_VALUE的线程数
  • 空闲线程会在60秒后回收
  • SynchronousQueue是一个没有容量的阻塞队列。每个插入操作必须等待另一个线程的对应移除操作,反之亦然

5.4 延期线程池newScheduledThreadPool()

源码:

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
}

public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }

ScheduledThreadPoolExecutor 方法介绍

scheduleAtFixedRate(Runnable command,//执行线程
                    long initialDelay,//初始化延迟
                    long period,//两次开始的执行的最小时间间隔
                    TimeUnit unit)//计时单位

你可能感兴趣的:(多线程,Executor)