java基础-并发编程-ThreadPoolExecutor源码学习

news2024/12/23 19:27:47

ThreadPoolExecutor源码

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

大纲

在这里插入图片描述

给线程池中添加任务

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }

新建Worker开始执行或添加任务到队列

private boolean addWorker(Runnable firstTask, boolean core) {
		// Worker数+1
        retry:
        for (int c = ctl.get();;) {
            // 1、当线程池状态为SHUTDOWN并且
            // 2、当线程池状态为STOP或第一个任务不为null或工作队列为空
            if (runStateAtLeast(c, SHUTDOWN)
                && (runStateAtLeast(c, STOP) || firstTask != null || workQueue.isEmpty()))
                return false;

            for (;;) {
                if (workerCountOf(c)
                    >= ((core ? corePoolSize : maximumPoolSize) & COUNT_MASK))
                    return false;
                // CAS 修改Worker数+1
                if (compareAndIncrementWorkerCount(c))
                    break retry;
                c = ctl.get();  // Re-read ctl
                if (runStateAtLeast(c, SHUTDOWN))
                    continue retry;
                // else CAS failed due to workerCount change; retry inner loop
            }
        }

        boolean workerStarted = false;
        boolean workerAdded = false;
        Worker w = null;
        try {
            w = new Worker(firstTask);
            final Thread t = w.thread;
            if (t != null) {
                final ReentrantLock mainLock = this.mainLock;
                mainLock.lock();
                try {
                    // Recheck while holding lock.
                    // Back out on ThreadFactory failure or if
                    // shut down before lock acquired.
                    int c = ctl.get();

                    if (isRunning(c) ||
                        (runStateLessThan(c, STOP) && firstTask == null)) {
                        if (t.getState() != Thread.State.NEW)
                            throw new IllegalThreadStateException();
                        workers.add(w);
                        workerAdded = true;
                        int s = workers.size();
                        if (s > largestPoolSize)
                            largestPoolSize = s;
                    }
                } finally {
                    mainLock.unlock();
                }
                if (workerAdded) {
                	// SharedThreadContainer
                    container.start(t);
                    workerStarted = true;
                }
            }
        } finally {
            if (! workerStarted)
                addWorkerFailed(w);
        }
        return workerStarted;
    }

runWorker

  • 执行在队列中等待的任务
  • 从队列中获不到待执行的任务时线程退出
final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
        	// while 执行任务,
        	// 第一次循环执行firstTask,
        	// 第二次循环开始从getTask()获取任务
        	// 当getTask()获取不到任务时线程退出
            while (task != null || (task = getTask()) != null) {
                w.lock();
                
                if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();
                try {
                    beforeExecute(wt, task);
                    try {
                    	// 执行任务
                        task.run();
                        afterExecute(task, null);
                    } catch (Throwable ex) {
                        afterExecute(task, ex);
                        throw ex;
                    }
                } finally {
                	// 将第一次循环中的任务重置为null
                    task = null;
                    w.completedTasks++;
                    w.unlock();
                }
            }
            completedAbruptly = false;
        } finally {
            processWorkerExit(w, completedAbruptly);
        }
    }

getTask

private Runnable getTask() {
        boolean timedOut = false; // Did the last poll() time out?

        for (;;) {
            int c = ctl.get();

            // Check if queue empty only if necessary.
            if (runStateAtLeast(c, SHUTDOWN)
                && (runStateAtLeast(c, STOP) || workQueue.isEmpty())) {
                decrementWorkerCount();
                return null;
            }

            int wc = workerCountOf(c);

            // Are workers subject to culling?
            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

            if ((wc > maximumPoolSize || (timed && timedOut))
                && (wc > 1 || workQueue.isEmpty())) {
                if (compareAndDecrementWorkerCount(c))
                    return null;
                continue;
            }

            try {
                Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                if (r != null)
                    return r;
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1012559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

竞赛选题 基于机器视觉的银行卡识别系统 - opencv python

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的银行卡识别算法设计 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng…

基于麒麟服务器V10的.NET部署、运行 + 金仓数据库

一言而论&#xff1a;基于麒麟服务器V10的.NET部署、运行&#xff0c;涉及的信创产品有麒麟、金仓&#xff0c;使用了.NET 6 API 文章目录 前言环境硬件环境软件环境 麒麟安装.NET麒麟安装金仓数据库.NET与KES通讯麒麟部署.NET总结参考资料 前言 紧跟着笔者的上一篇文章《银河…

使用HandlerInterceptor 中注入其他service时为null分析及解决

一情况分析 1.1 拦截器代码 public class ServerInterceptor implements HandlerInterceptor {private static final Logger _logger LoggerFactory.getLogger(ServerInterceptor.class);PrintWriter out;JSONObject res new JSONObject();AutowiredUserInfoLoginService u…

我也惊呆了!原来软件开发根本不需要会编码

一、前言 众所周知&#xff0c;完成一个大型的企业级系统&#xff0c;公司往往需要大量的人力做支持后盾&#xff0c;例如需要需求分析师、数据库管理员、前台美工、后台程序员、测试人员等。在快速发展中的企业&#xff0c;尤其是中小企业&#xff0c;都是一个萝卜多个坑&…

【软件推荐】屏蔽手机开屏广告

有时博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能未同步&#xff0c;请认准https://blog.zysicyj.top 首发博客地址 软件介绍 李跳跳APP是一款强大的手机软件弹窗广告跳过软件。通常我们使用的广告拦截软件是通过直接代理网络来过滤广告&#xf…

AI改写-AI改写可以迅速生成新的文章有什么弊端吗?

大家好&#xff0c;今天我们要聊一聊一个近年来备受热议的话题&#xff1a;147SEO改写。现在人工智能技术已经发展到了可以帮助我们改写文章的程度。这听起来似乎很神奇&#xff0c;但也引发了一些深思。我们将在本文中讨论这个话题&#xff0c;看看AI改写究竟是一种利好还是一…

SAP CRM 模块:概述,体系结构

前言 CRM 代表“客户关系管理”&#xff0c;是一组有助于以有组织的方式管理客户关系的方法和工具。 在当今竞争激烈的商业环境中&#xff0c;顶级公司的注意力越来越集中于其最有价值的资产– 客户。 因此&#xff0c;这些公司需要一种合适的软件解决方案来迎合其客户&#…

华为云云耀云服务器L实例评测|云耀云服务器购买流程与功能介绍

目录 概述什么是云耀云服务器L实例功能概述 技术参数处理器和内存存储和网络GPU加速 强大的计算能力高性能计算集群大规模并行计算 灵活可扩展的存储本地SSD存储产品购买流程 概述 什么是云耀云服务器L实例 云耀云服务器L实例是新一代开箱即用、面向中小企业和开发者打造的全新…

NFT Insider#107:The Sandbox和Unstoppable Domains合作,YGG“超级任务”冠军诞生

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

xxl-job-代码创建任务执行本地命令+解决报错

问题描述 因为环境受限&#xff0c;所以我的mysql和xxl-job-admin是放在docker里的&#xff0c;执行器是放在本地的&#xff0c;要执行的命令也需要本地环境。 本文将记录相关配置、实现过程和遇到的问题及解决方案。 配置 xxl-job-admin配置 xxl-job-admin放在docker容器…

虚拟机批量备份时缩短备份窗口的方法之一:串/并行快照

一条备份任务中是可以同时备份多个虚拟机的&#xff0c;虚拟机在备份的时候&#xff0c;需要对其进行打快照来保证数据的一致性。 对虚拟机进行打快照&#xff0c;需要消耗一定的时间&#xff0c;当虚拟机开启时&#xff0c;虚拟机的内存状态也会被快照下来&#xff0c;因此快…

无涯教程-JavaScript - INDIRECT函数

描述 INDIRECT函数返回由文本字符串指定的引用。 如果您在Excel公式中键入引用B1,则Excel会理解这引用了单元格B1。但是,Excel无法将文本字符串" B1"理解为引用。因此,如果单元格引用采用文本字符串的形式,则需要使用INDIRECT函数将其转换为实际的单元格引用。 立…

SpringMvc---编码过滤器(解决乱码问题)

目录 一、介绍 二、字符编码过滤器 一、介绍 在传递参数时&#xff0c;tomcat8以上能处理get请求的中文乱码&#xff0c;danshibunengqingqiupost请求的中文乱码。 二、字符编码过滤器 对于出现的中文乱码问题&#xff0c;SpringMvc提供了处理中文乱码的过滤器&#xff0c;在…

短视频矩阵系统源码技术独立部署搭建

一、矩阵系统源码主要有三种框架&#xff1a; 矩阵系统源码主要有三种框架&#xff1a;Matplotlib、NumPy和SciPy。Matplotlib是一个用于制图的库&#xff0c;可用于绘制各种类型的图表&#xff0c;包括线图、散点图、柱状图等。NumPy是用于处理大型多维数组和矩阵的库&#x…

Canvas 低代码工具,多人自研开发全流程优化|ModelWhale 版本更新

白露时节、秋雨殷勤&#xff0c;ModelWhale 也迎来了新一轮的版本更新&#xff0c;多层面持续优化你的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 优化 Canvas 多人自研开发流程&#xff08;团队版✓&#xff09; 新增 Canvas 组件历史…

AIGC 设计能替代真正的设计师设计吗?

AIGC 设计能替代真正的设计师设计吗&#xff1f; 目录 一、写在前面的话 二、AIGC 设计能替代真正的设计师吗&#xff1f; 1.1、传统设计师设计 1.2、AIGC设计 1.3、相关概念 1.4、观点分析 &#xff08;1&#xff09;、审美角度 &#xff08;2&#xff09;、版权角度 …

2023十大杰出外盘黄金交易APP平台最新排名

黄金&#xff0c;作为全球最重要的避险资产之一&#xff0c;一直备受投资者青睐。随着科技的发展&#xff0c;手机炒黄金APP平台逐渐成为投资者的新选择。本文将为您介绍“2023十大杰出外盘黄金交易APP平台最新排名”&#xff0c;帮助您选择合适的平台进行黄金投资。 本次排名…

埃文科技受邀出席“安全堤坝”技术论坛

2023年9月11日&#xff0c;2023年国家网络安全宣传周河南省活动开幕式暨河南省网络文明大会在开封博物馆开幕。由CCF YOCSEF郑州举办的“聚焦数据交易监管技术&#xff0c;筑牢数据交易‘安全堤坝’”技术论坛在开封市博物馆二楼会议厅举行。埃文科技总经理王永博士与副总经理武…

【深度学习】 Python 和 NumPy 系列教程(廿六):Matplotlib详解:3、多子图和布局:subplots()函数

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 3、多子图和布局 1. subplot()函数 2. subplots()函数 简单示例 一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名&#xff0…

汽车电子 -- PCAN View 安装与使用

一、PCAN-View 简介 参看&#xff1a;PCAN-View PCAN View 是显示CAN和CAN FD报文的Window软件 PCAN-View 功能概述 PCAN-View for Windows软件是一款简便的CAN监视软件&#xff0c;可用于显示、发送、和记录CAN数据通讯。可手动和定期发送报文&#xff0c;用户可决定比特率…