首页 > 其他分享 >线程池-2:runWorker分析-1

线程池-2:runWorker分析-1

时间:2024-03-30 13:30:16浏览次数:26  
标签:分析 runWorker shutdownNow worker 任务 线程 executor 执行

为何runWorker中在task被当前worker中的当前线程获取到准备执行task时需要进行worker.lock()?

如下图:

1、某个worker中的run逻辑只会被worker中包装的线程进行执行;

2、按理说:不会存在多个线程并发执行同一个worker中的runWorker()逻辑,那么为什么需要在当前线程已经获取到task后进行w.lock()操作呢?

其实原因是:当前worker如果正在执行某个task任务逻辑,那么worker其实是属于被上锁(就是当前worker锁)的阶段。那么外部线程-比如main线程,想要进行线程池shutdown操作,操作worker时就可以提供针对worker同步的能力:

如上可以知道:worker中线程正在处理任务时,shutdown()逻辑中获取worker锁会失败,那么无法进行线程中断;

线程池 executor.shutdown() 跟 executor.shutdownNow()的区别

在 Java 中,executor.shutdown()executor.shutdownNow() 都是用来关闭线程池的方法,但它们之间有一些区别:

  1. executor.shutdown(): 调用该方法后,线程池将不再接受新的任务提交,但会等待已经提交的任务执行完成(包括等待队列中的任务)。线程池会逐渐关闭,直到所有任务都执行完毕,最终线程池被关闭。

  2. executor.shutdownNow(): 调用该方法后,线程池会尝试立即关闭,它会尝试中断正在执行的任务,并清空任务队列,未执行的任务会被移除。这可能会导致一些任务无法执行完成。

总的来说,executor.shutdown() 是一个温和的关闭线程池的方式,它会等待任务执行完成;而 executor.shutdownNow() 则是一种强制关闭线程池的方式,它会尝试立即关闭线程池,可能会导致部分任务无法执行完成。

在选择使用哪种方法时,根据实际情况考虑是否需要等待任务执行完成以及是否允许部分任务被丢弃。

executor.shutdownNow() 会立刻将线程池中的线程停止么?比如线程-1正在处理某个任务逻辑中

executor.shutdownNow() 方法会尝试立即关闭线程池,包括中断正在执行的任务和清空任务队列。但是需要注意的是,对于正在执行的任务,线程池会尝试中断它们,但并不能保证一定能够立即停止执行。具体来说:

  • 如果任务是可中断的(即任务内部响应中断),那么 shutdownNow() 会发送中断信号给任务,任务有可能会被中断,停止执行。

  • 如果任务不是可中断的,那么 shutdownNow() 只能等待任务执行完成。这种情况下,即使调用了 shutdownNow() 方法,任务仍然会继续执行直到完成。

因此,shutdownNow() 方法并不能保证立即停止线程池中所有线程的执行,特别是对于不可中断的任务。它会尽最大努力去停止线程的执行,但无法完全保证。

1、中断所有worker中的线程;

2、从队列中排出所有等待中的任务;

worker中的线程什么时候会执行完?

关键点在getTask()什么时候返回null?

在给定的代码中,getTask() 方法是用来获取任务的。在这个方法中,根据一系列条件判断,可能会返回 null。下面是可能导致返回 null 的情况:

1、如果线程池的运行状态 rs 大于等于 SHUTDOWN 并且队列为空,或者 rs 大于等于 STOP 并且队列为空,这表示线程池已经处于关闭状态并且队列为空,那么会递减工作线程计数并返回 null

if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
    decrementWorkerCount();
    return null;
}

2、如果工作线程数 wc 大于最大线程数 maximumPoolSize 或者允许核心线程超时(allowCoreThreadTimeOut 为 true)且 timedOut 为 true,并且(工作线程数大于1 或者 队列为空),那么会尝试递减工作线程计数并返回 null

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

标签:分析,runWorker,shutdownNow,worker,任务,线程,executor,执行
From: https://blog.csdn.net/CSDN_G_Y/article/details/137169447

相关文章

  • 35.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-登录成功数据包内容分析
    免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!如果看不懂、不知道现在做的什么,那就跟着做完看效果内容参考于:易道云信息技术研究院VIP课上一个内容:34.登录数据包的监视与模拟首先登陆游戏,到角色选择界面,如下图,可以看到这个数据包很大2421个字节首先确定......
  • 【机器学习】数据探索(Data Exploration)---数据质量和数据特征分析
    一、引言  在机器学习项目中,数据探索是至关重要的一步。它不仅是模型构建的基础,还是确保模型性能稳定、预测准确的关键。数据探索的过程中,数据质量和数据特征分析占据了核心地位。数据质量直接关系到模型能否从数据中提取有效信息,而数据特征分析则决定了模型能否准确捕捉......
  • 线程的安全问题
    目录导言:正文:1.共享资源:2.非原子操作:3.执行顺序不确定:4.可见性:5.死锁和饥饿:6.指令重排序:总结:导言:线程安全是并发编程中的一个重要概念,它指的是在多线程环境下,对共享数据的访问和修改不会导致数据的不一致或其他不可预料的结果。在Java中,线程安全问题通常涉及到共......
  • 并发锁与线程池(二)
    前置内容:并发锁与线程池(一)1.互斥锁的实现#include<stdio.h>#include<pthread.h>#include<unistd.h>#defineTHREAD_COUNT 10pthread_mutex_tmutex;void*thread_callback(void*arg){ int*pcount=(int*)arg; inti=0; while(i++<100000)......
  • Java面试必问题22:如何创建线程池(偏重点)&&创建线程池的注意事项
    企业最佳实践:不要使用Executors直接创建线程池,会出现OOM问题,要使用ThreadPoolExecutor构造方法创建,引用自《阿里巴巴开发手册》【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽......
  • Java面试必问题21:线程池核心参数
    publicThreadPoolExecutor(intcorePoolSize,                        intmaximumPoolSize,                        longkeepAliveTime,                        TimeUnitunit,        ......
  • openGauss 慢SQL根因分析
    慢SQL根因分析可获得性本特性自openGauss3.0.0开始引入。特性简介慢SQL一直是数据运维中的痛点问题,如何有效诊断慢SQL根因是当前一大难题,工具结合openGauss自身特点融合了现网DBA慢SQL诊断经验,该工具可以支持慢SQL根因15+,能同时按照可能性大小输出多个根因并提供针对性的建议......
  • openGauss 高级分析函数支持
    高级分析函数支持可获得性本特性自openGauss1.1.0版本开始引入。特性简介无。客户价值我们提供窗口函数来进行数据高级分析处理。窗口函数将一个表中的数据进行预先分组,每一行属于一个特定的组,然后在这个组上进行一系列的关联分析计算。这样可以挖掘出每一个元组在这个集合......
  • openGauss 分布式分析能力
    分布式分析能力可获得性本特性自openGauss3.1.0版本开始引入。特性简介基于openLookeng实现分布式分析能力,与shardingsphere配合openGauss组成HTAP数据库。客户价值通过openLookeng快速实现海量数据分析。特性描述openLookeng复用shardingsphere中间件的分库分表能力,使op......
  • 数值分析复习:Newton-Cotes求积公式及复合求积公式
    文章目录1.中矩形公式2.梯形公式3.Simpson(辛普森)公式4.Newton-Cotes(牛顿-科特斯)求积公式5.各种求积公式的性质6.复合求积公式本篇文章适合个人复习翻阅,不建议新手入门使用本专栏:数值分析复习的前置知识主要有:数学分析、高等代数、泛函分析1.中矩形公式......