一起学并发编程 - 优雅关闭

Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用。文本将介绍两种可以优雅的终止线程的方式...

<!-- more -->

第一种

在JAVA《Java多线程模式》中有一种叫Two-Phase Termination(两步终止)的模式可以优雅的终止线程,这种模式采用了两个步骤来终止线程,所以叫两步终止模式

  • 先将执行标志位isShutdown 设为false,使工作中的线程转变为终止处理中的状态
  • 真正去执行终止操作,这样的做法可以保证线程的安全性、生命性和响应性。
class Worker extends Thread {private volatile boolean isShutdown = true;public void shutdown() {System.out.println("接收到关闭通知......");this.isShutdown = false;interrupt();}@Overridepublic void run() {while (this.isShutdown) {System.out.println("正在工作:" + System.currentTimeMillis());try {Thread.sleep(1000);} catch (InterruptedException e) {System.out.println("打断正在工作的线程......");}}System.out.println("销毁......");}
}public class ThreadClose {public static void main(String[] args) throws InterruptedException {Worker worker = new Worker();worker.start();//开始工作Thread.sleep(3 * 1000);worker.shutdown();//优雅关闭}
}

运行日志

正在工作:1505828036769
正在工作:1505828037770
正在工作:1505828038771
接收到关闭通知......
打断正在工作的线程......
销毁......
  • 安全性:不会在线程正在执行关键区域--Critical Section的时候突然结束掉
  • 生命性:一定会进行终止处理,shutdown()中,会调用interrupt(),保证即使线程处于sleepwait状态也可以被立即终止
  • 响应性:将isShutdown 设为volatile ,能保证线程收到终止请求后,会尽快开始终止处理。

存在的问题:针对没有阻塞的情况:设置标志变量,让线程正常自然死亡,和谐!,但是如果在调用shutdown发生阻塞情况呢?

第二种

在 《多线程第一章》的时候,介绍过守护线程的作用,那么是不是可以通过开启守护线程的方式去监听

功能

1.当工作结束就关闭主线程(主线程销毁守护线程也会跟着一同销毁)
2.如果任务长时间未完成,停止工作任务,减少开销

编码

1.定义主线程与发送的指令
2.在主线程run方法中创建一个守护线程,用来执行我们投递的任务
3.前面已经介绍过join的功能,它可以阻塞主线程,等待子线程完成后主线程继续执行
4.如果join释放后,发送完成指令

private Thread executeService;
private volatile boolean finished = false;
public void execute(Runnable task) {executeService = new Thread(() -> {Thread runner = new Thread(task);runner.setDaemon(true);runner.start();try {runner.join();//前面已经说过join与线程了finished = true;} catch (InterruptedException e) {System.out.println("打断正在工作的线程......");}});executeService.start();
}

5.创建listener(long mills),监听工作情况
6.监听任务是否完成,如果未完成监听当前是否逾期,逾期打断线程结束监听

public void listener(long mills) {System.out.println("开启监听......");long currentTime = System.currentTimeMillis();while (!finished) {if ((System.currentTimeMillis() - currentTime) >= mills) {System.out.println("工作耗时过长,开始打断...");executeService.interrupt();//打断线程break;}try {executeService.sleep(100L);//每隔100毫秒检测一次} catch (InterruptedException e) {e.printStackTrace();}}
}

7.测试

public static void main(String[] args) {WorkerService service = new WorkerService();long start = System.currentTimeMillis();service.execute(() -> {try {Thread.sleep(3 * 1000);// TODO 模拟加载数据} catch (InterruptedException e) {e.printStackTrace();}});service.listener(4 * 1000);System.out.println("一共耗时:" + (System.currentTimeMillis() - start));
}

listener(4 * 1000) 的运行日志,当任务完成会直接退出,并不会一直占用

开启监听......
一共耗时:3049

listener(2 * 1000) 的运行日志,当任务超时直接打断线程,减少资源占用

开启监听......
工作耗时过长,开始打断...
一共耗时:2050
打断正在工作的线程......

- 说点什么

全文代码:https://gitee.com/battcn/battcn-concurent/tree/master/Chapter1-1/battcn-thread/src/main/java/com/battcn/chapter4

  • 个人QQ:1837307557
  • battcn开源群(适合新手):391619659

微信公众号:battcn(欢迎调戏)

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

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

相关文章

mac安装完mysql后关机特别慢_mysql-Mac终端下遇到的问题总结

为了方便启动mysql服务&#xff0c;修改/etc/.bash_profile文件&#xff0c;如下alias mysql"/usr/local/mysql/bin/mysql"alias mysqladmin"/usr/local/mysql/bin/mysqladmin"或者alias mysqlstart"sudo /usr/local/mysql/support-files/mysql.serve…

sending data mysql slow Mysql查询非常慢的可能原因

1.用explain看看mysql的执行情况,可以得知,task_id扫描了近20万条数据,而且这个task_id不是索引 2.为这个task_id所在的表,将此字段添加索引后,查询就变得很快了 转载于:https://www.cnblogs.com/Skrillex/p/7365590.html

打包上架

昨天写的打包上架&#xff0c;分组到了文章&#xff0c;发现不便查看贴链接到这里&#xff1a; http://www.cnblogs.com/ITCoderW/articles/7597969.html 最近一个版本的审核的过程 当我们上传到APP Store一个新的版本后 登录ITunes Connect就可以看到相应的版本的审核的状态 粗…

架构设计--仅是软件开发之第二大影响力?!

SDWest2006&#xff08;译注1&#xff09;对我来说是个有趣的大会。我除了星期三之外&#xff08;当时我正飞往费城参加一个客户会议 因此错过了Jolt颁奖部分&#xff09;每天都在演讲。我也参加了一些谈话和会议&#xff1b;其中最引人关注的是Mike Cohn的计划与估算的谈话。…

WiFi密码分享有妙招 不必口头相传

移动互联网的迅速崛起&#xff0c;使得我们可以方便的使用手持移动设备进行上网。尤其是在家庭中&#xff0c;使用智能手机、平板电脑、笔记本电脑等移动设备进行上网和娱乐已经成为主流&#xff0c;台式机上网正日渐式微。在家中时&#xff0c;我们通过无线路由器提供的WiFi网…

javaweb(二十一)——JavaWeb的两种开发模式

一、JSPJavaBean开发模式 1.1、jspjavabean开发模式架构 jspjavabean开发模式的架构图如下图(图1-1)所示 图1-1 在jspjavabean架构中&#xff0c;JSP负责控制逻辑、表现逻辑、业务对象&#xff08;javabean&#xff09;的调用。 JSPJavaBean模式适合开发业务逻辑不太复杂的web应…

概率论与数理统计思维导图知识框架_考研概率论与数理统计 综合题型秘籍思维导图① 随机变量1~3章 [21考研上岸之旅]...

Hello World&#xff0c;我的朋友&#xff0c;这里是一颗小白蛋&#xff0c;大千世界&#xff0c;很高兴以这样的方式与你相遇前言在复习过程中发现概率论知识点很少且集中 所以没有分开章节去整理王安式概率论辅导讲义张宇概率论9讲方浩强化班1800题 综合题型秘籍在学习过程中…

php mysql删除失败_php+MySQL实战案例【七】数据编辑、删除

​本节内容中讲解用户管理模块中的修改用户信息和删除用户。修改用户信息&#xff1a;可对选择的用户记录进行编辑&#xff0c;可修改用户名、密码、性别、手机、邮箱和地址信息。删除用户信息&#xff1a;将列表中指定的用户进行删除操作。二、编辑用户信息编辑用户信息&#…

1.three.js世界的4大要素

一、三大组件 在Three.js中&#xff0c;要渲染物体到网页中&#xff0c;我们需要3个组建&#xff1a;场景&#xff08;scene&#xff09;、相机&#xff08;camera&#xff09;和渲染器&#xff08;renderer&#xff09;。有了这三样东西&#xff0c;才能将物体渲染到网页中去。…

架构设计 例子和实践

系统设计说明书(架构、概要、详细)目录结构 虽然这些文档一般来说公司都是有模板的&#xff0c;但我写这些文档以来基本上是每写一次就把目录结构给改一次&#xff0c;应该说这是因为自己对这些文档的理解开始加深&#xff0c;慢慢的越来越明白这些文档的作用和其中需要阐述的东…

activiti 批量 mysql_Activiti6系列(3)- 快速体验

一、部署启动activiti####1、部署&#xff0c;将两个war包拷贝到Tomcat下即可。![](https://img2018.cnblogs.com/blog/1755845/201908/1755845-20190802010532367-2002399291.png)2、启动tomcat&#xff0c;访问http://127.0.0.1:8080/activiti-app默认账号密码&#xff1a;ad…

【启动】Windows上启动图形化软件,报错: 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll...

今天在安装了jetbrains官网上的ToolBox软件后&#xff0c;没有办法启动起来&#xff0c;报错如下&#xff1a; 无法启动此程序&#xff0c;因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll 尝试重新安装了并没有什么用&#xff0c;现在来解决方法&#xff1a; 直接找到官方的…

论文: YOLO9000-Better,Faster,Stronger

论文阅读&#xff1a; YOLO9000-Better,Faster,Stronger YOLOv2 是经过改造之后的YOLO Batch Normalization&#xff1a;在所有的conv layer后加了BN之后提高了2% mAP&#xff0c;BN可以帮助regularize模型&#xff0c;这样的话就可以放弃 dropout。 High Resolution Classifi…

怎么ie取消要打开或保存来自_取消认证后,发票抵扣就这么简单!

点击标题下「中财讯集团」可快速关注3月1日起&#xff0c;取消增值税发票认证的纳税人范围扩大至全部一般纳税人。一般纳税人可以自愿使用增值税发票选择确认平台查询、选择用于申报抵扣、出口退税或者代办退税的增值税发票信息。具体如何操作呢&#xff1f;掌握以下步骤&#…

好的软件架构设计

什么是架构 前言&#xff1a;软体设计师中有一些技术水平较高、经验较为丰富的人&#xff0c;他们需要承担软件系统的架构设计&#xff0c;也就是需要设计系统的元件如何划分、元件之间如何发生相互作用&#xff0c;以及系统中逻辑的、物理的、系统的重要决定的作出。在很多公…

python线程状态_Python线程

1. 线程基础1.1. 线程状态线程有5种状态&#xff0c;状态转换的过程如下图所示&#xff1a;1.2. 线程同步(锁)多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时&#xff0c;可能存在数据不同步的问题。考虑这样一种情况&#xff1a;一个列…

JavaScript中错误正确处理方式,你用对了吗?

JavaScript的事件驱动范式增添了丰富的语言&#xff0c;也是让使用JavaScript编程变得更加多样化。如果将浏览器设想为JavaScript的事件驱动工具&#xff0c;那么当错误发生时&#xff0c;某个事件就会被抛出。理论上可以认为这些发生的错误只是JavaScript中的简单事件。 本文将…

文件分割机

文件分割与合并 要求&#xff1a;实现对大文件的分割与合并。 按指定个数切&#xff08;如把一个文件切成10份&#xff09;或按指定大小切&#xff08;如每份最大不超过10M&#xff09;&#xff0c;这两种方式都能够。 程序说明&#xff1a; 文件分割&#xff1a;把一个文件分割…

mysql pow函数怎么用_pow函数怎么用

PHP pow函数表示指数表达式。pow函数怎么用&#xff1f;php pow()函数 语法作用&#xff1a;pow()函数的作用是将一个数进行n次方计算后返回语法&#xff1a;pow(X,Y);参数&#xff1a;X表示要做处理的数字Y表示指定n次方中的n数值说明&#xff1a;返回X的Y次方幂&#xff0c;如…

【IntelliJ IDEA】添加一个新的tomcat,tomcat启动无法访问欢迎页面,空白页,404

第一部分&#xff0c;添加一个tomcat 1.先把Toolbar 和 Tool Buttons显示出来 2.选择Edit Configurations 3.添加一个新的tomcat server进来 解决no artifacts configured问题&#xff0c;就是没有项目加入里面 先添加一个没有的项目 启动之后找不到 页面 第二部分&#xff0c…