Executor源码解读

  • 〇、[源码版本] jdk 1.8
  • 一、不再显式创建线程
    • [举例1]代码示例
  • 二、不严格要求执行是异步的
    • [举例1]代码示例
  • 三、任务在调用者线程之外的某个线程中执行
    • [举例1]代码示例
  • 四、施加了某种限制的复合执行器
    • [举例1]代码示例
  • 五、concurrent包中提供的Executor的实现对象
    • [举例1]ExecutorService,这是一个更广泛的接口。
    • [举例2]ThreadPoolExecutor类,提供了一个可扩展的线程池实现。
    • [举例3]Executors类,为这些类和接口提供了的工厂和实用方法。
  • 六、内存一致性影响
  • 七、Executor接口只提供了execute方法
    • execute方法

〇、[源码版本] jdk 1.8

一、不再显式创建线程

Executor接口是执行提交的Runnable任务的对象。这个接口提供了一种方法,将任务提交与每个任务如何运行的机制解耦,包括线程使用、调度等的细节。通常使用Executor而不是显式创建线程。

[举例1]代码示例

为一组任务中的每个调用显式创建线程的方法:

new Thread(new(RunnableTask())).start()

使用Executor方式可以替代显示创建线程的方法:

Executor executor = <em>anExecutor</em>;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());

二、不严格要求执行是异步的

然而,Executor接口并不严格要求执行是异步的。在最简单的情况下,一个执行器可以立即在调用者的线程中运行提交的任务。

[举例1]代码示例

class DirectExecutor implements Executor {public void execute(Runnable r) {r.run();}
}

三、任务在调用者线程之外的某个线程中执行

更典型的是,任务在调用者线程之外的某个线程中执行。

[举例1]代码示例

下面的执行程序为每个任务生成一个新线程 。

class ThreadPerTaskExecutor implements Executor {public void execute(Runnable r) {new Thread(r).start();}}

四、施加了某种限制的复合执行器

许多Executor的实现对象,对任务的调度方式和时间施加了某种限制。

[举例1]代码示例

下面的执行器将任务的提交序列化到第二个执行器,是复合执行器。

 class SerialExecutor implements Executor {final Queue<Runnable> tasks = new ArrayDeque<Runnable>();final Executor executor;Runnable active;SerialExecutor(Executor executor) {this.executor = executor;}public synchronized void execute(final Runnable r) {tasks.offer(new Runnable() {public void run() {try {r.run();} finally {scheduleNext();}}});if (active == null) {scheduleNext();}}protected synchronized void scheduleNext() {if ((active = tasks.poll()) != null) {executor.execute(active);}}}

五、concurrent包中提供的Executor的实现对象

concurrent包中提供的Executor的实现对象有:

[举例1]ExecutorService,这是一个更广泛的接口。

一个ExecutorService使用可能的几个线程池中的一个线程池,执行每个提交的任务,通常使用 Executors工厂方法进行配置。

[举例2]ThreadPoolExecutor类,提供了一个可扩展的线程池实现。

继承自AbstractExecutorService接口,AbstractExecutorService实现了ExecutorService接口。

线程池解决两个不同的问题:
a.它们通常在执行大量异步任务时提供改进的性能,因为减少了每个任务的调用开销。
b.它们提供了一种限制和管理资源的方法,包括线程,在执行任务集合时的消耗。
同时,每个ThreadPoolExecutor还维护一些基本的统计信息,例如已完成任务的数量。

[举例3]Executors类,为这些类和接口提供了的工厂和实用方法。

在此concurrent包中定义了ExecutorExecutorServiceScheduledExecutorServiceThreadFactoryCallable类。

六、内存一致性影响

内存一致性影响:将Runnable对象提交给Executor之前,线程中的操作,其内存可见性发生在线程的执行开始前,也可能在另一个线程中。

七、Executor接口只提供了execute方法

execute方法

 void execute(Runnable command);

execute方法:在将来的某个时间执行给定的command命令。命令可以在新线程、池线程或调用线程中执行,具体取决于Executor的实现。
a.参数:runnable类型的任务
b.返回:无
c.异常:
throws RejectedExecutionException
如果参数任务command不能被接受执行
throws NullPointerException
如果参数任务commandnull

Executor源码解读相关推荐

  1. [并发编程] - Executor框架#ThreadPoolExecutor源码解读03

    文章目录 Pre execute源码分析 addWorker()解读 Worker解读 Pre [并发编程] - Executor框架#ThreadPoolExecutor源码解读02 说了一堆结论性 ...

  2. [并发编程] - Executor框架#ThreadPoolExecutor源码解读02

    文章目录 Pre 线程池的具体实现 线程池的创建 参数解读 corePoolSize maximumPoolSize keepAliveTime unit workQueue threadFactor ...

  3. 并发编程之 Executor 线程池原理与源码解读

    并发编程之 Executor 线程池原理与源码解读 线程是调度 CPU 资源的最小单位,线程模型分为 KLT 模型与 ULT 模型,JVM使用的是 KLT 模型.java线程与 OS 线程保持 1:1 ...

  4. KClient——kafka消息中间件源码解读

    目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.K ...

  5. Future源码解读

    Future源码解读 〇.[源码版本] jdk 1.8 一.Future概述 [举例1]示例代码 [举例2]示例代码 内存一致性影响 二.Future接口的方法 cancel方法 isCancelle ...

  6. Executors源码解读——创建ExecutorService线程池

    Executors源码解读--创建ExecutorService线程池 〇.[源码版本] jdk 1.8 一.线程池概述 二.线程池创建 三.Executors源码解读 newFixedThreadP ...

  7. ExecutorService源码解读

    ExecutorService源码解读 〇.[源码版本] jdk 1.8 一.ExecutorService接口详解 1.ExecutorService关闭方法概述 [举例1]代码示例 2.Execu ...

  8. hystrix 源码 线程池隔离_“池”的思想:从java线程池到数据库连接池的源码解读(1)...

    一. java线程池 带着问题: 线程是什么时候被创建的? 线程会一直循环取任务任务吗?怎么做的? 线程取不到任务会怎么样? 线程会被Runnable和Callable的异常干掉吗? 线程怎么干掉自己 ...

  9. PostgreSQL 源码解读(31)- 查询语句#16(查询优化-表达式预处理#1)

    本节简单介绍了PG查询优化对表达式预处理中连接Var(RTE中的Var,其中RTE_KIND=RTE_JOIN)溯源的过程.处理逻辑在主函数subquery_planner中通过调用flatten_j ...

最新文章

  1. Kdevelop的安装-2种方法
  2. 联想EDU同传系统 版本7.5 7.6在机房中出现的一些故障和解决办法
  3. [转载]工作面试时最难的25个问题
  4. node 大写_大写Node.js模块
  5. Oracle数据库为何出现乱码
  6. mysql的读写分离之maxscale中间件
  7. Qt6.2.2+libCef Demo
  8. 电脑如何分盘win10_如何给win10电脑系统盘分区?
  9. python 在线ide搭建_从头开始制作OJ-在线IDE的搭建
  10. php微信商家转账到零钱 发起商家转账API
  11. nabcd分析解谜类rpg游戏
  12. (金融入门知识点)Double类型丢失精度
  13. js 实现在线考试切屏代码
  14. CK-GW06-E01网关与欧姆龙PLC配置指南
  15. Bootrom -> bootloader -> kernel -> init >android
  16. word中图片为嵌入式格式时显示不全_word中图片设置嵌入式后无法显示完整的解决方案(转)...
  17. 图像增强系列之图像自动去暗角算法。
  18. 分布式消息队列RocketMQ与Kafka的18项差异之“拨乱反正”
  19. 解决selenium遇到火狐浏览器自动打开下载文件
  20. 英语不好影响考PMP吗?

热门文章

  1. Https的前世今生
  2. 教你如何进入有密码的 XP 系统(下)
  3. ansible: Linux批量管理神器
  4. normalizr API
  5. EditText焦点问题
  6. Excel 自定义关闭按钮
  7. ajax实现浏览器前进后退-location.hash与模拟iframe
  8. jquery选择器《-》
  9. 数据连接池druid 和 大数据框架druid
  10. react json转换_Typescript + React 新手篇