奈学:Executor框架的概述

简介: JDK1.5之前,我们如果想要使用Java线程来完成相关任务,一般涉及两个类,一个是Thread类,一个Thread对象在启动(start)之后会创建一个关联的本地操作系统线程,随后会自动回调run方法。另一个是Runnable接口,可以看作 run方法的抽象,代表线程任务。通过Runnable和Thread的配合可以编写我们自己的多线程逻辑。

  JDK1.5之前,我们如果想要使用Java线程来完成相关任务,一般涉及两个类,一个是Thread类,一个Thread对象在启动(start)之后会创建一个关联的本地操作系统线程,随后会自动回调run方法。另一个是Runnable接口,可以看作 run方法的抽象,代表线程任务。通过Runnable和Thread的配合可以编写我们自己的多线程逻辑。
  可以看到,此时Java对于多线程编程的支持还是比较原始的,功能也并不多。因此,在JDK1.5的JUC包中,对Java的多线程应用做了一次全面的扩展,比如新lock锁、并发容器等,还有一个重要的扩展就是出现了Executor执行框架。
  Executor执行框架将Java线程的应用做了更细致的功能划分,并且进行了功能的增强,大概包括三个部分:
  线程任务
  JDK1.5之前,只有Runnable代表线程任务,对于受检异常,必须手动在try catch中处理,不支持throws声明可能抛出的异常,不支持任务返回值。
  JDK1.5的时候,出现了Callable接口,可以看作Runnable的增强:对于受检异常,可以不用在try catch中处理,支持throws声明可能抛出的异常,并且支持任务返回值。
  执行器
  JDK1.5之前,线程任务的执行需要我们手动创建Thread对象、传入任务、并调用start方法,一个任务对应一个线程,它们之间的关联非常紧密,这样对于线程任务的管理、线程资源的复用等功能几乎没有,或者只能自己手动实现,非常麻烦。
  JDK1.5的时候,出现了Executor线程池。线程池作为任务执行器,我们只需要创建指定的线程池,随后将线程任务传入线程池中,由线程池来确定是将任务直接分配给池中的线程去执行、还是创建线程并执行、或者是加入任务队列等待等等逻辑,使用线程池之后我们不再需要手动创建线程去执行,并且可以实现线程的复用以及线程任务的管理等强大的功能。执行器(线程池)将任务与线程解耦!
  异步执行结果
  JDK1.5之前,在线程任务启动之后,对于线程任务监控几乎没有,我们不知道任务有没有完成,也没办法定义任务的返回值等一系列信息。
  JDK1.5的时候,出现了Future接口以及它的各种实现。这个接口体系代表了线程任务异步计算的结果,通常与Callable线程任务连用。利用了Future设计模式,在一个线程A执行线程任务的时候,我么可以在另一个线程B中异步的通过Future的实现的相关方法完成判断对应线程任务是否执行完毕、是否被取消、手动取消正在执行的线程任务、以及从执行完毕的线程任务中获取返回值等功能。
  有了执行框架,我们只需创建线程任务、然后交给指定的线程池去执行,执行完毕之后等待获取返回结果即可,不再需要关注线程的创建、开启、执行、回收等基础性的中间工作,将任务与线程解耦,程序员更加的关注线程任务本身(这里是和业务相关的),有利于多线程程序的开发!
  如果想要使用执行框架,只需要看相关api文档即可!那么我们有必要深入理解执行框架吗?当然时间充足的情况下是有必要的,只有我们知道了执行框架的原理之后,才能更好的使用它。执行框架属于JDK自带的基础框架,经历了时间和众多Java开发者的考验,不求能够手写,仅仅学习它的设计精华,包括各种设计模式,同时避开隐藏的坑,对于程序员个人的后续职业发展也是具有很大帮助的!
  线程任务、执行器、执行结果这三部分,都可以围绕着Executor线程池展开,因此下面我们将从Executor入手,并且会穿插介绍Callable和Future的相关原理。
本文来源于:奈学开发者社区,如有侵权,请联系我删除~

相关文章
|
SQL 分布式计算 大数据
大数据Spark框架概述
大数据Spark框架概述
205 0
|
5月前
|
存储 Java 数据库连接
技术好文:quartz基本介绍和使用
技术好文:quartz基本介绍和使用
222 0
|
2月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
160 5
|
5月前
|
Java 程序员 调度
Java并发编程之Executor框架深度解析
【6月更文挑战第24天】在Java的并发编程领域,Executor框架是处理多线程任务的核心。本文将深入探讨Executor框架的设计哲学、核心组件以及如何高效利用这一框架来提升程序的性能和响应性。我们将通过实例演示如何正确配置和使用Executor,并讨论常见的陷阱与最佳实践。
|
6月前
|
分布式计算 Java 调度
[Java 探索者之路] 一个大厂都在用的分布式任务调度平台
[Java 探索者之路] 一个大厂都在用的分布式任务调度平台
|
Java 测试技术 调度
【优化技术专题】「温故而知新」基于Quartz系列的任务调度框架的动态化任务实现分析
【优化技术专题】「温故而知新」基于Quartz系列的任务调度框架的动态化任务实现分析
153 0
【优化技术专题】「温故而知新」基于Quartz系列的任务调度框架的动态化任务实现分析
|
调度 数据库
任务调度 Quartzh 框架企业级实战案例
任务调度 Quartzh 框架企业级实战案例
150 0
|
运维 NoSQL 数据库连接
定时任务能力进击!Quartz框架的使用
定时任务能力进击!Quartz框架的使用
|
Android开发 iOS开发 计算机视觉
【第四篇】XiaoZaiMultiAutoAiDevices之核心机制
在上一期说到主要的流程和部分核心运行流程,这一期我们主讲:`如何通过外部参数指定脚本运行指定设备` 测试框架传参,可能一部分同学会想到unittest的DDT,使用pytest相关装饰器和各种外部文件的数据传入方式。
102 0