【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析_threadpooltaskexecutor如何继承父线程属性-程序员宅基地

技术标签: java  # Java并发源码  

线程池系列:

在看 ThreadPoolExecutor 的源码前,我们先来看一下 ThreadPoolExecutor 的继承关系

在这里插入图片描述

1.Executor

定义 execute 方法来执行任务,入参是 Runnable,无出参

public interface Executor {
    
    void execute(Runnable command);
}

2.ExecutorService

Executor 的功能太弱,ExecutorService 丰富了对任务的执行和管理的功能,主要代码如下:

public interface ExecutorService extends Executor {
    
    // 提交有返回值的任务,使用 get 方法可以阻塞等待任务的执行结果返回
    <T> Future<T> submit(Callable<T> task);
    // 提交没有返回值的任务,如果使用 get 方法的话,任务执行完之后得到的是 null 值
    Future<?> submit(Runnable task);
    
    // 给定任务集合,返回已经执行完成的 Future 集合,每个返回的 Future 都是 isDone = true 的状态
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        throws InterruptedException;
    // 给定任务中有一个执行成功就返回,如果抛异常,其余未完成的任务将被取消
    <T> T invokeAny(Collection<? extends Callable<T>> tasks)
        throws InterruptedException, ExecutionException;
    
    // 关闭,不会接受新的任务,也不会等待未完成的任务
    // 如果需要等待未完成的任务,可以使用 awaitTermination 方法
    void shutdown();
    // 在超时时间内,等待剩余的任务终止
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;
    
    // executor 是否已经关闭了,返回值 true 表示已关闭
    boolean isShutdown();
    // 所有的任务是否都已经终止,是的话,返回 true
    boolean isTerminated();
    
}

3.AbstractExecutorService

  • 抽象类,封装了 Executor 的很多通用功能
  • 实现了部分 ExecutorService 方法
public abstract class AbstractExecutorService implements ExecutorService {
    
   
    // 将Callabbe,想要返回值的Runnable转化成Callable
    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
    
        return new FutureTask<T>(runnable, value);
    }
    // FutureTask(Runnable,T) -> RunnableFuture -> Runnable
    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
    
        return new FutureTask<T>(callable);
    }
    
    // submit调用的还是execute
    // 只不过将Callable,要返回值的Runnable提前转化成了RunnableFuture
    // 提交无返回值的任务
    public Future<?> submit(Runnable task) {
    
        if (task == null) throw new NullPointerException();
        // ftask 其实是 FutureTask
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }
    
    // 提交有返回值的任务
    public <T> Future<T> submit(Callable<T> task) {
    
        if (task == null) throw new NullPointerException();
        // ftask 其实是 FutureTask
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43935927/article/details/113966340

智能推荐

括号匹配算法的C++实现_使用c++编写一个数据结构的检查括号匹配性的代码-程序员宅基地

文章浏览阅读259次。我们遍历输入的字符串,当遇到一个左括号时,将其压入栈中;当遇到一个右括号时,检查栈顶元素是否是与之匹配的左括号。如果不是匹配的左括号,或者栈为空,则括号不匹配。最后,如果栈为空,说明所有的括号都匹配。通过这种简单而直接的栈操作,我们可以有效地检查括号匹配,并在编程中避免出现括号不匹配的错误。括号匹配是一种常见的编程问题,涉及到检查给定的字符串中的括号是否正确匹配。你可以尝试修改示例字符串中的括号,或者使用其他字符串进行测试,以验证括号匹配算法的正确性。这表明示例字符串中的括号是正确匹配的。_使用c++编写一个数据结构的检查括号匹配性的代码

CISSP考试指南笔记:1.4 安全框架part5_cissp 安全框架行业标准-程序员宅基地

文章浏览阅读186次。这一节非常重要,在后面章节都会遇到,而且考试都或多或少会遇到。流程管理开发1.ITIL。ITIL(以前的信息技术基础设施图书馆)是由英国中央计算机和电信局(该机构在1990年代末被政府商务办公室(Office of Government Commerce,简称OGC)并入)在20世纪80年代开发的。它现在由AXELOS控股,AXELOS是英国政府和私人公司Capita的合资企业。ITIL是IT服务管理最佳实践的事实标准。ITIL的创建是因为越来越依赖信息技术来满足业务需求。ITI_cissp 安全框架行业标准

Office 2016 简体中文批量授权版镜像下载_ed2k://|file|sw_dvd5_office_professional_plus_2016-程序员宅基地

文章浏览阅读6.3k次。Office 2016 简体中文批量授权版镜像下载(含Visio、Project) 此处整理了office2016 VOL大客户批量授权版下载资源,包含了office2016 32位+64位版本、project2016 32位+64位版本、Visio2016 32位+64位版本。其实office2016的大客户版和批量授权版在功能上并没有任何区别,只是在授权方式上不同而已,相对来说,VOL大客户版激活更加简单,下面提供的资源也都是VL大客户版。(零售版本资源请前往itellyou查看下载)..._ed2k://|file|sw_dvd5_office_professional_plus_2016_64bit_chnsimp_mlf_x20-424

Q:请问WinDriver是否支持Vxworks?_vxworks5.4可以使用workbench吗-程序员宅基地

文章浏览阅读773次。Q:请问WinDriver是否支持Vxworks?A:WinDriver支持部分Vxworks版本,但由于市场需求因素,目前我们仅支持至Vxworks5.4版本。若您欲支持至最新Vxworks版本,Jungo可以专门为您完成,此费用约为US$50,000,以及两个月的时间,并且请将您的开发板寄送至Jungo原厂。_vxworks5.4可以使用workbench吗

CMU15-445-Spring-2023-Project #1 - 前置知识(lec01-06)-程序员宅基地

文章浏览阅读985次,点赞23次,收藏18次。数据库是相互关联的数据的有组织集合,对现实世界的某些方面进行建模。区别于DBMS(MySQL、Oracle)。

SpringBoot项目部署-程序员宅基地

文章浏览阅读2.3k次,点赞105次,收藏115次。在真实开发中,在不同环境下运行项目往往会进行不同的配置,比如开发环境使用的是开发数据库,测试环境使用的是测试数据库,生产环境使用的是生产数据库。看到上诉内容就可以知道已经运行成功了,接下来我们访问ip地址:8081/printLog查看是否启动成功这里的ip地址是我的虚拟机ip地址,5. 查看所有的镜像,出现springbootdocker代表镜像构建成功。可以看到该目录少了BOOT-INF,打包是不完整的,也无法运行jar包。查看所有的镜像,出现springbootlogback代表镜像构建成功。_springboot项目部署

随便推点

尚硅谷2020最新版宋红康JVM教程持续更新中(java虚拟机详解,jvm从入门到精通) - ppt课件_尚硅谷jvmppt百度网盘-程序员宅基地

文章浏览阅读6.7k次,点赞12次,收藏69次。尚硅谷宋红康JVM教程(java虚拟机详解,jvm从入门到精通)_哔哩哔哩 -bilibilihttps://www.bilibili.com/video/av83622425文章中来源于Spirit_wolf老师一边看视频一边截图PPT的整理:https://gitee.com/Spirit_wolf/jvm-video-shk谢谢~_尚硅谷jvmppt百度网盘

洛谷题单全套题解(java版)_洛谷java写b2002-程序员宅基地

文章浏览阅读464次,点赞9次,收藏12次。【代码】洛谷题单全套题解(java版)_洛谷java写b2002

Hive一次性获取多维度的聚合结果_hive 三个维度组合时,如何查询groupingsets的预聚合结果?-程序员宅基地

文章浏览阅读622次,点赞18次,收藏8次。在Hive中,grouping sets是一种用于在单个查询中进行多组聚合的扩展语法,它允许用户在GROUP BY子句中指定多个聚合组合,以减少查询数量,提高查询效率。每个组合由一个或多个列组成,Hive会为每个组合计算聚合结果并合并为一个结果集。如果某个列未包含在grouping sets中,则对应的聚合结果将为NULL。_hive 三个维度组合时,如何查询groupingsets的预聚合结果?

Sol-Dp-多米诺骨牌_二维骨牌覆盖 dp-程序员宅基地

文章浏览阅读125次。Solution of ZJOI2009-多米诺骨牌咕咕咕_二维骨牌覆盖 dp

Jenkins入门介绍-程序员宅基地

文章浏览阅读7.7k次,点赞3次,收藏32次。一、介绍 Jenkins是开源的,使用Java编写的持续集成的工具,Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,从而更早的进入测试阶段,更早的发现问题。二、功能1、持续的软件版本发布/测试项目。2、监控外部调用执行的工作。三、安装 进入Jenkins下载地址;选择适合的系统和版本;地址:Jenkins download and de..._jenkins

送给写小程序的你。-程序员宅基地

文章浏览阅读176次。声明:本人也是菜鸟一只,写的不好的地方,大佬们指点指点。欢迎来点点我的博客微信小程序商城,持续更新。(已经跳槽了,但是还是小程序相关的项目/斜眼)先说说写小程序的渊源吧,我之前认识的大佬写了一个比较简单的小程序,我改了改样式于是成功的有了我的第一个小程序。然后我在找工作的时候,简历上写了这么一回事,结果进来之后,leader语重心长的对我说,公司的小程序商城就教给你了,重点是公司没有一个人会微信..._ssl证书配置需要使用pem,不使用crt

推荐文章

热门文章

相关标签