Java Executor 框架

一 概述

我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等。线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从 JDK1.5 开始,为了把工作单元与执行机制分离开,Executor 框架诞生了,他是一个用于统一创建与运行的接口。Executor 框架实现的就是线程池的功能。

线程的工作单位是 Runnable 和 Callable,执行机制由 Executor 框架提供。

二 Executor 框架

2.1 Executor 框架的两级调度

在上层,Java 多线程程序通常把应用分解成为若干任务,然后使用用户级的调度器 (Executor 框架) 将这些任务映射成为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。
在这里插入图片描述

应用程序通过 Executor 框架控制上层的调度;而下层的调度由操作系统内核控制,下层的调度不受应用程序的控制。

2.2 Executor 框架的结构

Executor 框架包括3大部分:

  • 任务:也就是工作单元,包括被执行任务需要实现的接口:Runnable 接口或者 Callable 接口
  • 任务的执行:也就是把任务分派给多个线程的执行机制,包括 Executor 接口及继承自 Executor 接口的 ExecutorService 接口,Executor 框架有两个关键类实现了 ExecutorService 接口 (ThreadPoolExecutor 和 ScheduThreadPoolExecutor)
  • 异步计算的结果:包括 Future 接口及实现了 Future 接口的 FutureTask 类

Executor 框架包含的主要的类与接口如下图所示:
在这里插入图片描述
下面是这些类和接口的简介:

  • Executor 是一个接口,它是 Executor 框架的基础,它将任务的提交与任务的执行分离开来
  • ThreadPoolExecutor 是线程池的核心实现类,用来执行被提交的任务
  • ScheduledThreadPoolExecutor 是一个实现类,可以在给定的延迟后运行命令,或者定期执行命令ScheduledThreadPoolExecutor 比 Timer 更灵活,功能更强大
  • Future 接口和实现 Future 接口的 FutureTask 类,代表异步计算的结果
  • Runnable 接口和 Callable 接口的实现类,都可以被 ThreadPoolExecutor 或 ScheduledThreadPoolExecutor 执行

Executor 框架的使用示意图如下:
在这里插入图片描述
主线程首先要创建实现 Runnable 或者 Callable 接口的任务对象。

  • Executors 可以把一个 Runnable 对象封装成为一个 Callable 对象

  • 然后将 Runnable 对象或者 Callable 对象直接交给 ExecutorService 执行

  • ExecutorService 将返回一个实现 Future 接口的对象。由于 FutureTask 实现 Runnable,程序员也可以创建 FutureTask,然后直接交给 ExecutorService 执行

  • 主线程可以执行 FutureTask.get() 方法等待任务执行完成

三 Executor 和 ExecutorService

Executor:一个接口,其定义了一个接收 Runnable 对象的方法 executor,其方法签名为 executor(Runnable command),该方法接收一个 Runable 实例,它用来执行一个任务,任务即一个实现了 Runnable 接口的类,一般来说 Runnable 任务开辟在新线程中的使用方法为:new Thread(new RunnableTask())).start(),但在 Executor 中,可以使用 Executor 而不用显示地创建线程:executor.execute(new RunnableTask()); // 异步执行

ExecutorService:是一个比 Executor 使用更广泛的子类接口,其提供了生命周期管理的方法,返回 Future 对象,以及可跟踪一个或多个异步任务执行状况返回Future的方法;可以调用ExecutorService的shutdown()方法来平滑地关闭 ExecutorService,调用该方法后,将导致ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关闭ExecutorService。因此我们一般用该接口来实现和管理多线程。

通过 ExecutorService.submit() 方法返回的 Future 对象,可以调用isDone()方法查询Future是否已经完成。当任务完成时,它具有一个结果,你可以调用get()方法来获取该结果。你也可以不用isDone()进行检查就直接调用get()获取结果,在这种情况下,get()将阻塞,直至结果准备就绪,还可以取消任务的执行。Future 提供了 cancel() 方法用来取消执行 pending 中的任务。ExecutorService 部分代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值