跟chatGpt 聊聊发布的时候老节点的线程池会怎么样

一、引言

        今天同事提了一个问题,每次系统发布的时候在老的节点服务里面的线程池会怎么样,队列里面的任务会被执行完毕吗?

c78350c33c994504a4655800ee0ad1cb.png

        博主一直认为优雅退出一定是会等执行完才退出的,结果跟chatGpt聊了聊,一波三折。

二、分析

1、ThreadPoolExecutor的退出

        博主问的是:java服务退出的时候,线程池的队列中的任务会怎么样?

        chatGpt回答:当 Java 服务退出时,线程池中尚未执行的任务(队列中的任务)的处理方式取决于线程池的类型和配置。对于标准的 ThreadPoolExecutor,当 Java 服务退出时,线程池会尝试完成尚未执行的任务。它会等待队列中的任务被执行完毕,并逐个处理每个任务,直到队列为空。这意味着线程池会等待所有已提交的任务完成,然后关闭线程池。

        默认情况下,ThreadPoolExecutor 使用的是非守护线程,因此线程池中的线程不会阻止 Java 服务的退出,但会继续执行任务直到队列为空。如果你想要在 Java 服务退出时立即停止线程池中的任务,可以将线程池的线程设置为守护线程(通过设置 setDaemon(true)),这样当主线程退出时,守护线程会被中断并停止任务的执行。

        这么一看,跟博主的想法是一致的,但是博主又想了一个问题,一般ThreadPoolExecutor 都是交给spring托管的,还得考虑一下spring。

@Beanpublic ThreadPoolExecutor threadPoolExecutor() {// 创建自定义的 ThreadPoolExecutor// ...}

2、spring托管ThreadPoolExecutor的退出

        博主问的是:Spring Boot不会等@bean定义的ThreadPoolExecutor执行完任务吗?

        chatGpt回答的是:在 Spring Boot 中,使用 @Bean 定义的 ThreadPoolExecutor 默认情况下不会等待其中的任务执行完毕。当 Spring Boot 应用程序关闭时,它会触发关闭钩子,自动关闭 Spring 容器中的所有对象,包括通过 @Bean 定义的线程池。

        默认情况下,Spring Boot 会调用线程池的 shutdown() 方法来关闭线程池,但不会等待其中的任务全部执行完毕。正在执行的任务会继续执行,而尚未执行的任务将会被丢弃。

        这就惊呆博主了,这样搞那不是队列堆的数据全完了,发布一次如果碰到一些流量,流量全是废掉。但是真的会这样吗?

3、shutdownNow与shutdown的区别

        既然spring用ThreadPoolExecutor 的shutdown方法关闭的线程池,那么回归源码看看吧,结果一看还有个shutdownNow方法,这明显带了点暴力和优雅的区别。

        看看两个方法之间的区别

public void shutdown() {final ReentrantLock mainLock = this.mainLock;mainLock.lock();try {checkShutdownAccess();advanceRunState(SHUTDOWN);interruptIdleWorkers();onShutdown(); // hook for ScheduledThreadPoolExecutor} finally {mainLock.unlock();}tryTerminate();}
public List<Runnable> shutdownNow() {List<Runnable> tasks;final ReentrantLock mainLock = this.mainLock;mainLock.lock();try {checkShutdownAccess();advanceRunState(STOP);interruptWorkers();tasks = drainQueue();} finally {mainLock.unlock();}tryTerminate();return tasks;}

        比较大的区别是:

        1、shutdownNow会取出任务返回

        2、shutdownNow会通过cas设置STOP状态,而shutdown会设置SHUTDOWN状态

        很明显区别在这个状态,那么这个状态是不是影响了队列任务呢,看一下获取队列任务方法

private Runnable getTask() {boolean timedOut = false; // Did the last poll() time out?for (;;) {int c = ctl.get();int rs = runStateOf(c);// Check if queue empty only if necessary.if (rs >= SHUTDOWN && (rs >= 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;}}}

        很明显华点在于if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())),当STOP的时候一定不会再返回任务给worker,但是SHUTDOWN的时候,队列为空才不返回,因此shutdown方法会继续执行队列中的任务,这也就和chatGpt说的产生了不同的结论!

4、bean的destroyMethod

        但是还有个问题,对象的销毁方法,一般是会在对象上指定shutdown

@Bean(name = "handoverExecutor", destroyMethod = "shutdown")public ThreadPoolExecutor handoverExecutor() {return new ThreadPoolExecutor(20, 30,600, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), new ThreadPoolExecutor.DiscardPolicy());}

        但是也有时候会不指定,走默认的,那么默认的是什么呢 

String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;public static final String INFER_METHOD = "(inferred)";

        这个inferred是什么方法,跟踪一下反射取方法的地方,可以看到没有close就取shutdown方法,而ThreadPoolExecutor是没有close方法的,因此它默认走shutdown

String destroyMethodName = beanDefinition.getDestroyMethodName();if (AbstractBeanDefinition.INFER_METHOD.equals(destroyMethodName) ||(destroyMethodName == null && closeableInterface.isInstance(bean))) {// Only perform destroy method inference or Closeable detection// in case of the bean not explicitly implementing DisposableBeanif (!(bean instanceof DisposableBean)) {try {return bean.getClass().getMethod(CLOSE_METHOD_NAME).getName();}catch (NoSuchMethodException ex) {try {return bean.getClass().getMethod(SHUTDOWN_METHOD_NAME).getName();}catch (NoSuchMethodException ex2) {// no candidate destroy method found}}}return null;}return (StringUtils.hasLength(destroyMethodName) ? destroyMethodName : null);

三、总结

        chatGpt在单一方面的知识搜索的确是比较深入精准,相对于直接从百度、谷歌、技术社区过滤大量的言论要好很多,可以说是一个优秀的AI搜索引擎。

        但是chatGpt的弱点在于不会分析,一旦结合多方面的知识,给出的信息可能是错的,各位同学还是多看权威书籍和源码、技术社区多交流,不用一味相信搜索引擎。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP行业未来的发展如何,和chatGPT聊聊SAP行业的发展前景

序言 Chat GPT 是 OpenAI 发布的最新语言模型&#xff0c;比其前身 GPT-3 有显著提升。与许多大型语言模型类似&#xff0c;ChatGPT 能以不同样式、不同目的生成文本&#xff0c;并且在准确度、叙述细节和上下文连贯性上具有更优的表现。它代表了 OpenAI 最新一代的大型语言模…

chatgpt赋能python:Python怎么联网

Python怎么联网 介绍 Python是一种高级的编程语言&#xff0c;它能够很容易地实现联网操作。Python的标准库中包含了许多模块&#xff0c;这些模块可以用来创建网络连接、发送和接收数据以及处理网络协议等。在本篇文章中&#xff0c;我们将介绍如何使用Python进行网络操作&a…

ChatGPT推出“联网模式”!可直接读取网页内容,网友:更好用了

金磊 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT又出big news了&#xff01; 官方推出了一种新模式——Default&#xff08;GPT-3.5&#xff09;with browsing。 而这个“联网模式”最大的亮点&#xff0c;就是可以随时引用网络数据。 也就是说&#xff0c;此前ChatGPT“截止2…

王炸功能ChatGPT 联网插件功能放开,视频文章一键变思维导图

就在上周5月13日&#xff0c;Open AI 发文称&#xff1a;“我们将在下周向所有ChatGPT Plus 用户开放联网功能和众多插件”。 这意味着什么&#xff1f; 首先联网功能将使得ChatGPT不再局限于回答2021年9月之前的信息&#xff0c;能直接联网查询最新消息。 而插件功能就可以在…

70多个新插件!ChatGPT可以联网啦!

Datawhale干货 体验&#xff1a;ChatGPT联网&#xff0c;编辑&#xff1a;机器之心 说不上无所不能&#xff0c;但也可以说是上天入地。 自 ChatGPT 推出以来&#xff0c;大语言模型充斥着新闻版面。很多公司都在试图追赶 OpenAI&#xff0c;但作为先行者&#xff0c;ChatGPT …

ChatGPT联网后几大功能

这周ChatGPT plus 已经可以联网了&#xff0c;联网后对我们的用处更大了&#xff0c;这里总结了几点ChatGPT联网 后的几个功能&#xff1a; 1.对给定的网页进行读取&#xff0c;并根据解读后来回答问题 给ChatGPT一个网址&#xff0c;让他总结一下这个网址&#xff0c;不到一…

Dify 基于 ChatGPT 构建本地知识库问答应用

一、Dify 自从 ChatGPT 横空出世之后&#xff0c;其极高的语言理解和交互能力不仅让人惊呼&#xff0c;ChatGPT不仅能够处理事实性问题&#xff0c;还能理解和生成情感色彩更浓厚的对话内容&#xff0c;能够识别用户的情感倾向&#xff0c;并据此作出相应的回应。这么好的东西…

当四款AI大模型遇上考公真题,谁被难倒了?

在当今社会&#xff0c;人工智能&#xff08;AI&#xff09;正以不可思议的速度发展&#xff0c;并在各个领域崭露头角&#xff0c;给人们的生活和工作带来许多便利。AI大模型被誉为人类“第二大脑”&#xff0c;成为人们学习、生活、工作的 “智能助手”。 公务员考试在我国教…

最短路径算法刷题笔记

Dijkstra最短路算法 理论 代码来自chatgpt&#xff0c;我感觉代码很好&#xff0c;比我在网上找到的好理解很多 #include <iostream> #include <cstring> using namespace std; const int N 110; const int INF 0x3f3f3f3f; int n, m; int g[N][N]; // 邻接矩阵…

动态规划算法刷题笔记【线性dp】

递推 斐波那契(Fibonacii)数列的递推公式&#xff1a;F(n) F(n -1) F(n - 2) 错排问题&#xff1a;F(n) (n-1) * [F(n-1)F(n-2)] 解释 例题 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法 思路 要想跳到…

基础数论算法刷题笔记

理论 最小公倍数、最大公约数 (ab)%n (a%nb%n)%n (ab)%n (a%nb%n)%n a≡2(mod n) —— a%n2 lcm——最小公倍数 gcd——最大公约数 lcm(a,b) a*b / gcd(a,b) 最小公倍数两数的乘积除以最大公约数 但是写程序时应该是 a /gcd(a,b) *b 因为a*b可能会超出数据范围 例子&…

LLM - 搭建 DrugGPT 结合药物化学分子知识的 ChatGPT 系统

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131384199 论文&#xff1a;DrugChat: Towards Enabling ChatGPT-Like Capabilities on Drug Molecule Graphs DrugChat&#xff0c;基…

两句话就搞死chatgpt

事情是这样的&#xff0c;我在看一本书--思维风暴&#xff0c;看到一篇发散思维的内容&#xff0c;就想考考chatgpt,结果第一句话发过去&#xff0c;chatGPT就直接报错&#xff0c;刷新了下页面&#xff0c;接着继续问&#xff0c;等了不多见&#xff0c;chatgpt慢慢吐字&#…

人人都是ChatGPT prompt 工程师

关于 Prompt ​ 解释这个词之前&#xff0c;首先需要解释 prompt 这个词&#xff1a; 简单的理解它是给 AI 模型的指令。 它可以是一个问题、一段文字描述&#xff0c;甚至可以是带有一堆参数的文字描述。AI 模型会基于 prompt 所提供的信息&#xff0c;生成对应的文本&…

ChatGPT总结的“商汤日日新大模型”,亮点在文末!!!

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G “我们正处于临界点。”在商汤科技董事长兼首席执行官徐立说出这句话后一个月&#xff0c;商汤科技…

装X型学习动机体系:我对成就目标定向理论(装逼)的研究,怎么让自己充满动力,这个我期待太久了

装X型学习动机体系&#xff1a;我对成就目标定向理论&#xff08;装逼&#xff09;的研究&#xff0c;怎么让自己充满动力&#xff0c;这个我期待太久了 本质篇&#xff1a;生命的本质是&#xff0c;渴望被看见动力篇&#xff1a;积极响应挑战&#xff0c;自恋克服惰性费曼学习…

40岁,刚被裁,想说点啥。

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

Go是一门面向对象编程语言吗

Go语言已经开源13年了[1]&#xff0c;在近期TIOBE[2]发布的2023年3月份的编程语言排行榜中&#xff0c;Go再次冲入前十&#xff0c;相较于Go在2022年底的排名[3]提升了2个位次&#xff1a; 《Go语言第一课》专栏[4]中关于Go在这两年开始飞起的“预言”也正在逐步成为现实^_^&am…

如何写出高质量的文章:从战略到战术

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

原力计划来了【协作共赢 成就未来】

catalogue &#x1f31f; 写在前面&#x1f31f; 新星计划持续上新&#x1f31f; 原力计划方向&#x1f31f; 原力计划拥抱优质&#x1f31f; AIGC&#x1f31f; 参加新星计划还是原力计划&#x1f31f; 创作成就未来&#x1f31f; 写在最后 &#x1f31f; 写在前面 哈喽&…