Executor源码解读
Executor源码解读
- 〇、[源码版本] jdk 1.8
- 一、不再显式创建线程
- [举例1]代码示例
- 二、不严格要求执行是异步的
- [举例1]代码示例
- 三、任务在调用者线程之外的某个线程中执行
- [举例1]代码示例
- 四、施加了某种限制的复合执行器
- [举例1]代码示例
- 五、concurrent包中提供的Executor的实现对象
- [举例1]
ExecutorService
,这是一个更广泛的接口。 - [举例2]
ThreadPoolExecutor
类,提供了一个可扩展的线程池实现。 - [举例3]
Executors
类,为这些类和接口提供了的工厂和实用方法。
- [举例1]
- 六、内存一致性影响
- 七、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
包中定义了Executor
、ExecutorService
、ScheduledExecutorService
、ThreadFactory
和Callable
类。
六、内存一致性影响
内存一致性影响:将Runnable
对象提交给Executor
之前,线程中的操作,其内存可见性发生在线程的执行开始前,也可能在另一个线程中。
七、Executor接口只提供了execute方法
execute方法
void execute(Runnable command);
execute
方法:在将来的某个时间执行给定的command
命令。命令可以在新线程、池线程或调用线程中执行,具体取决于Executor
的实现。
a.参数:runnable
类型的任务
b.返回:无
c.异常:
throws RejectedExecutionException
如果参数任务command
不能被接受执行
throws NullPointerException
如果参数任务command
为null
Executor源码解读相关推荐
- [并发编程] - Executor框架#ThreadPoolExecutor源码解读03
文章目录 Pre execute源码分析 addWorker()解读 Worker解读 Pre [并发编程] - Executor框架#ThreadPoolExecutor源码解读02 说了一堆结论性 ...
- [并发编程] - Executor框架#ThreadPoolExecutor源码解读02
文章目录 Pre 线程池的具体实现 线程池的创建 参数解读 corePoolSize maximumPoolSize keepAliveTime unit workQueue threadFactor ...
- 并发编程之 Executor 线程池原理与源码解读
并发编程之 Executor 线程池原理与源码解读 线程是调度 CPU 资源的最小单位,线程模型分为 KLT 模型与 ULT 模型,JVM使用的是 KLT 模型.java线程与 OS 线程保持 1:1 ...
- KClient——kafka消息中间件源码解读
目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.K ...
- Future源码解读
Future源码解读 〇.[源码版本] jdk 1.8 一.Future概述 [举例1]示例代码 [举例2]示例代码 内存一致性影响 二.Future接口的方法 cancel方法 isCancelle ...
- Executors源码解读——创建ExecutorService线程池
Executors源码解读--创建ExecutorService线程池 〇.[源码版本] jdk 1.8 一.线程池概述 二.线程池创建 三.Executors源码解读 newFixedThreadP ...
- ExecutorService源码解读
ExecutorService源码解读 〇.[源码版本] jdk 1.8 一.ExecutorService接口详解 1.ExecutorService关闭方法概述 [举例1]代码示例 2.Execu ...
- hystrix 源码 线程池隔离_“池”的思想:从java线程池到数据库连接池的源码解读(1)...
一. java线程池 带着问题: 线程是什么时候被创建的? 线程会一直循环取任务任务吗?怎么做的? 线程取不到任务会怎么样? 线程会被Runnable和Callable的异常干掉吗? 线程怎么干掉自己 ...
- PostgreSQL 源码解读(31)- 查询语句#16(查询优化-表达式预处理#1)
本节简单介绍了PG查询优化对表达式预处理中连接Var(RTE中的Var,其中RTE_KIND=RTE_JOIN)溯源的过程.处理逻辑在主函数subquery_planner中通过调用flatten_j ...
最新文章
- Kdevelop的安装-2种方法
- 联想EDU同传系统 版本7.5 7.6在机房中出现的一些故障和解决办法
- [转载]工作面试时最难的25个问题
- node 大写_大写Node.js模块
- Oracle数据库为何出现乱码
- mysql的读写分离之maxscale中间件
- Qt6.2.2+libCef Demo
- 电脑如何分盘win10_如何给win10电脑系统盘分区?
- python 在线ide搭建_从头开始制作OJ-在线IDE的搭建
- php微信商家转账到零钱 发起商家转账API
- nabcd分析解谜类rpg游戏
- (金融入门知识点)Double类型丢失精度
- js 实现在线考试切屏代码
- CK-GW06-E01网关与欧姆龙PLC配置指南
- Bootrom -> bootloader -> kernel -> init >android
- word中图片为嵌入式格式时显示不全_word中图片设置嵌入式后无法显示完整的解决方案(转)...
- 图像增强系列之图像自动去暗角算法。
- 分布式消息队列RocketMQ与Kafka的18项差异之“拨乱反正”
- 解决selenium遇到火狐浏览器自动打开下载文件
- 英语不好影响考PMP吗?