并发编程学习---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框架)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上
任务的两级段调度模型

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)//计时单位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值