修改网站自动关闭时间timeout_优雅关闭线程池的方案

news/2024/5/14 0:40:26/文章来源:https://blog.csdn.net/weixin_39856265/article/details/110830509

10d82fad34d763ee00f5ed683641d98b.png

  • 我们经常在项目中使用的线程池,但是是否关心过线程池的关闭呢,可能很多时候直接再项目中直接创建线程池让它一直运行当任务执行结束不在需要了也不去关闭,这其实是存在非常大的风险的,大量的线程常驻在后台对系统资源的占用是巨大的 ,甚至引发异常。所以在我们平时使用线程池时需要注意优雅的关闭,这样可以保证资源的管控。

  • Java 中和关闭线程池相关的方法主要有如下:

    • void shutdown()

    • List shutDownNow

    • boolean awaitTermination

    • boolean isShutDown

    • boolean isTerminated

  • 对于这些方法有着不同的使用和作用,下面我们真的会这些不同的方法做详细的介绍。

ShutDown

  • shutDown 方法从字面意思我们可以看到是停止关闭的意思,我们先来看下面的一段代码,首先我们通过 ThreadPoolExecutor 来创建一个容量是10的无界线程池,与 FixedThreadPool 类似的,这里手动创建可以更好地理解线程池的创建。在后我们提交一千个任务执行,再执行 shutdown 方法进行暂停。
 public static void main(String[] args) throws InterruptedException {        ExecutorService service = new ThreadPoolExecutor(                10,                10,                0L,                TimeUnit.MILLISECONDS,                new LinkedBlockingQueue<>());        for (int i = 0; i < 1000; i++) {            service.submit(() ->{                try {                    TimeUnit.SECONDS.sleep(1);                } catch (InterruptedException e) {                    System.out.println("接受中断,不处理~~");                }                System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName());            });        }        service.shutdown();    }
  • 我们可以看到结果所以线程会正常执行结束后再关闭线程池,对于 ShutDown 而言它可以安全的停止一个线程池,它有几个关键点
  • ShutDown 会首先将线程设置成 SHUTDOWN 状态,然后中断所有没有正在运行的线程
  • 正在执行的线程和已经在队列中的线程并不会被中断,说白了就是使用shutDown 方法其实就是要等待所有任务正常全部结束以后才会关闭线程池
  • 调用 shutdown() 方法后如果还有新的任务被提交,线程池则会根据拒绝策略直接拒绝后续新提交的任务。

ShutDownNow

  • 这个方法与上面方法相比较,直观就是 now ,即立即停止任务,
  • 同样是上述案列,略作修改如下,
public static void main(String[] args) throws InterruptedException {        ExecutorService service = new ThreadPoolExecutor(                10,                10,                0L,                TimeUnit.MILLISECONDS,                new LinkedBlockingQueue<>(1000));        for (int i = 0; i < 1000; i++) {            service.submit(() ->{                try {                    TimeUnit.SECONDS.sleep(1);                } catch (InterruptedException e) {                    System.out.println("接受中断,结束线程~~");                    //这里响应中断                    return;                }                System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName());            });        }      final List runnables = service.shutdownNow();       System.out.println(runnables);    }
  • 执行上述代码我们发现,当执行shutDownNow 方法后,会像全部正在运行的队列通知中断,正在运行的线程接收到中断信号后选择处理,而在队列中的全部取消执行转移到一个list队列中返回,如上述 List runnables ,这里记录了所有终止的线程

awaitTermination

  • 这个方法并不是用来关闭线程池的,首先我们看一下这个方法的定义:

boolean awaitTermination_(long timeout, TimeUnit unit)_

  • 可以看到这个方法有两个参数,timeout 表示等待的时间,unit 时间单位
  • 这个方法的作用是,调用后等待timeout时间后,反馈线程池的状态,
  • 等待期间(包括进入等待状态之前)线程池已关闭并且所有已提交的任务(包括正在执行的和队列中等待的)都执行完毕,相当于线程池已经“终结”了,方法便会返回 true
  • 等待超时时间到后,第一种线程池“终结”的情况始终未发生,方法返回 false
  • 等待期间线程被中断,方法会抛出 InterruptedException 异常。
  • 上面代码可以修改来测试,这里不再粘贴代码

isShutDown

  • isShutDown 方法正如名字,判断线程池是否停止,返回的是 Boolean 类型,如果已经开始停止线程池则返回 true 否则放回false
  • 当调用了shutDownshutDownNow 时之后,会返回 true 不过需要注意,这时候只是代表线程池关闭流程的开始,并不是说线程池已经停止了

isTerminated

  • 这个方法与上面的方法的区别就是这是正真检测线程池是否真的终结了
  • 这不仅代表线程池已关闭,同时代表线程池中的所有任务都已经都执行完毕了,因为在调用 shutdown方法之后,线程池会继续执行里面未完成的任务,包括正在执行的任务和在任务队列中等待的任务。
  • 如果调用了 shutdown 方法,但是有一个线程依然在执行任务,那么此时调用 isShutdown方法返回的是 true,而调用 isTerminated方法返回的便是 false,因为线程池中还有任务正在在被执行,线程池并没有真正“终结”。
  • 直到所有任务都执行完毕了,调用 isTerminated()方法才会返回 true,这表示线程池已关闭并且线程池内部是空的,所有剩余的任务都执行完毕了。


本文由AnonyStar 发布,可转载但需声明原文出处。
欢迎关注微信公账号 :云栖简码 获取更多优质文章
更多文章关注笔者博客 :云栖简码 i-code.online

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

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

相关文章

在这里输入你要搜索的内容怎么不显示_网站收录释疑,当遇到收录问题,我们该怎么处理...

做SEO的童鞋们都清楚&#xff0c;网站收录是一个网站能够获得排名的基础&#xff0c;网站内容被搜索引擎收录&#xff0c;它才有可能在这个搜索引擎里获得排名&#xff0c;这是先决条件。网站收录是什么&#xff1f;打个比方&#xff0c;一个高中生要在全国高考获得名次&#x…

爬虫得到的页面和实际页面有出入_蜘蛛爬虫抓取网站页面的策略

如今&#xff0c;每天都有很多SEO人员在在更新着网站的页面&#xff0c;如果搜索引擎中蜘蛛爬虫没有选择性的抓取页面&#xff0c;那将会是一个庞大的工作量。根据以上情况可以了解到&#xff0c;蜘蛛爬虫在进行抓取的时候&#xff0c;是有一定的策略的&#xff0c;是有选择性的…

Vue预渲染prerender-spa-plugin的使用,改善少数营销页面的 SEO

1. 安装&#xff1a; cnpm i prerender-spa-plugin -D 2. 配置&#xff1a; webpack.prod.conf.js&#xff1a; const PrerenderSPAPlugin require(prerender-spa-plugin) const Renderer PrerenderSPAPlugin.PuppeteerRenderer ... plugins: [ ...// 预渲染new Prerende…

打不开网站 服务器程序错误怎么办啊,“网站打不开”怎么办?快速排查思路及解决方案...

一、域名解析不生效原因分析&#xff1a;域名解析并非添加后就会立即生效&#xff0c;解析不生效就会让域名找不到服务器&#xff0c;这样就会造成网站打不开。解析长时间无法生效或不对&#xff0c;需要联系域名提供商或者dns提供商协助排查。目前解析不生效有以下原因&#x…

git desktop发布到gitee_MAC系统下利用gitee和Hexo建个人网站-各种坑各种填

今天心血来潮&#xff0c;想建一个个人博客把自己的日常一些内容整理放到一起。以前建过一个网站&#xff0c;但是懒于打理&#xff0c;一直也没认真去做&#xff0c;域名和购买的主机的钱也打了水漂。痛定思痛&#xff0c;决定自己这次先来试试免费的&#xff0c;不用花自己钱…

http status 404 – 未找到_[SEO名词]网站404页面是什么?

404其实是一种http状态码&#xff0c;代表用户在浏览网页时&#xff0c;服务器无法提供正确信息或是服务器因不明原因导致不能正常返回信息。简单点说就是网页未找到或者网页丢失&#xff0c;就是出现404状态码。出现404的网页&#xff0c;我们称为404页面。404页面的影响打开的…

android 游戏引擎 排行_海淀seo优化:搜索引擎通用SEO优化技术

常常有一些人问不一样的百度搜索引擎的seo优化工作中有哪些不一样?从SEO提升的实践活动特点上看来&#xff0c;要是认真掌握SEO的压根&#xff0c;搞好基本提升;深入了解百度搜索引擎的优化算法标准&#xff0c;循规蹈矩地做&#xff0c;即便 百度搜索引擎的服务平台不一样&am…

url 参数传递的两种方式_SEO的最佳URL结构是什么?

您的许多访问者都会通过点击链接访问您的网站&#xff0c;因此您可能想知道特定网页的实际网址中的内容是否真实重要。您可能会惊讶地发现&#xff0c;当谈到现场搜索引擎优化时&#xff0c;您的网址看起来真的非常重要。一、什么是URL结构&#xff1f;您的网站URL作为您在网络…

检测到有程序正在访问网络_花旗银行、eBay等网站窃取访问者隐私信息 Behave可监测网站行为...

一个名为Behave&#xff01;的新浏览器扩展。如果网站正在使用脚本对网络上的本地和私有IP地址执行扫描或攻击&#xff0c;则会发出警告。浏览网页时&#xff0c;网页上嵌入的脚本不仅可以用于扫描访问者的计算机中是否存在开放的TCP端口&#xff0c;还可以对网络上的其他设备发…

网站底部运行时间的php代码,在wordpress网站底部添加运行时间和加载时间

效果如下图代码加到footer.php底部完整代码如下&#xff1a;本次查询<?php echo get_num_queries(); ?> 次 用时<?php timer_stop(1); ?> 秒已稳定运行function runTime() {var d new Date(), str ;BirthDay new Date("2019-3-8");today new Dat…

网站打开出现服务器错误代码,网站打开出现“404”错误怎么解决?

**404这个状态码是很多Seoer分析网站日志时常见到的&#xff0c;那么404错误是什么意思呢&#xff1f;它表示客户端请求的网页不存在&#xff0c;因此返回** 404代码&#xff1b;服务器找不到请求的网页。服务器上不存在的网页经常会返回此代码&#xff1f;如果出现这种情况&am…

live2d_二次元 | live2d为你的网站博客增加萌萌哒的看板娘

首先科普下什么是Live2D来源百度百科&#xff1a;Live2D是一种应用于电子游戏的绘图渲染技术&#xff0c;技术由日本Cybernoids公司开发。通过一系列的连续图像和人物建模来生成一种类似三维模型的二维图像&#xff0c;对于以动画风格为主的冒险游戏来说非常有用&#xff0c;缺…

云服务器有必要做cdn吗,使用云服务器建立网站有必要使用CDN加速吗?

有站长问到&#xff1a;我是使用云服务器来建立博客网站&#xff0c;是否还有必要使用CDN加速?其实&#xff0c;这位站长的意思估计是说&#xff1a;我使用云服务器建立的网站&#xff0c;云服务器性能强悍&#xff0c;用户访问站点速度也挺快的&#xff0c;是否还有必要使用 …

php签入html出来的影响seo吗_SEO公司经常会被问到的10个SEO问题

网站优化公司就是近些年来专门建立于以网站优化作为主营业务的网络团队企业&#xff0c;专门为企业或个人客户提供网站优化服务&#xff0c;通过网站优化公司提供的服务让企业从网络上得到相应的价值。SEO不但是体力加脑力的工作&#xff0c;而且还是很能锻炼人的身心&#xff…

网站不许 firefox 显示被嵌入的网页_平静网页下的隐私围猎,你可以选择奋起反击...

一、引言当你浏览网页的时候&#xff0c;看似平静的网页下面&#xff0c;你的隐私正在被围猎。除了大多数网站都在做的隐私收集外&#xff0c;还存在其他更多的风险&#xff0c;详见下文。这些隐私收集和风险来源的主要途径就是JavaScript。本文将介绍JavaScript是什么&#xf…

php cms 存储过程,迅睿CMS 网站迁移搬家

情况一&#xff1a;前后网站域名相同网站从服务器A迁移到服务器B时&#xff0c;需要做以下操作&#xff1a;1、服务器A域名和服务器B域名一致的情况下2、备份服务器A的全部文件和数据库&#xff0c;以免出错3、服务器A环境一定要保证能运行CMS程序&#xff0c;最好保持一致4、将…

网站域名、备案、七牛云图床重新搭建与博客整理

最近碰上了一个问题&#xff0c;七牛云开始回收测试域名&#xff0c;结果导致我的图床有些失灵、一些软件资源都无法下载。其实这个问题在前一段不蒜子统计修改的博客里已经有兆头了。不过当时没注意。最后还是被逼得只能购买了域名&#xff0c;各类备案&#xff0c;重新搭建图…

阿里云安装nginx配置网站

本期带来一篇最近在阿里云服务器上折腾nginx配置网站的教程。 文章目录1 nginx简介2 阿里云安装nginx3 配置nginx4 基本命令以及错误1 nginx简介 nginx是一个轻量级的web服务器&#xff0c;我的认知&#xff0c;这东西跟负载平衡不分家。这里抄下度娘简介。 Nginx是一款轻量级…

.net平台下的手机在线wap网站模拟器(附源代码)

目前可以模拟wap浏览的软件不多&#xff0c;如my3gate,winwap.两者不能本地测试&#xff0c;不能满足开发opear可以在电脑上看&#xff0c;可是屏幕太大&#xff0c;做的内容超过了手机的显示范围!现在线上的wap模拟器是用asp程序做的&#xff0c;太繁琐且不能在.net上运行于是…

apache如何加载系统环境变量_如何安装Tomcat以及简单发布网站教程

安装步骤第一步&#xff1a;下载和安装 Java下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html。安装并设置JAVA_HOME环境变量&#xff1a;第二步&#xff1a;下载和解压 Tomcat下载地址&#xff1a;http://tomcat.apache.org/。第三步…