Java多线程编程安全退出线程方法介绍
线程停止
Thread提供了一个stop()方法,但是stop()方法是一个被废弃的方法。为什么stop()方法被废弃而不被使用呢?原因是stop()方法太过于暴力,会强行把执行一半的线程终止。这样会就不会保证线程的资源正确释放,通常是没有给与线程完成资源释放工作的机会,因此会导致程序工作在不确定的状态下
那我们该使用什么来停止线程呢
Thread.interrupt(),我们可以用他来停止线程,他是安全的,可是使用他的时候并不会真的停止了线程,只是会给线程打上了一个记号,至于这个记号有什么用呢我们可以这样来用。
public class Mythread extends Thread{ public void run(){ super.run(); for(int i =0 ;i<50000;i++){ if(this.interrupted()){ System.out.println("停止"); break; } } System.out.println("i="+(i+1)); } } public class Run{ try{ MyThread thread = new MyThread(); thread.start(); thread.sleep(1000); thread.interrupt(); //打上标记 }catch(Exception e){ System.out.println("main"); e.printStackTrace(); } System.out.println("end!") }
虽然这样就会停止下来 ,可是For后面的语句还是会执行。
异常法 退出线程
public class Mythread extends Thread{ public void run(){ super.run(); try{ for(int i =0 ;i<50000;i++){ if(this.interrupted()){ System.out.println("停止"); throw new Exception(); } } System.out.println("i="+(i+1)); }catch(Exception e){ System.out.println("抛出异常了"); e.printStackTrace(); } } }
解释 如果当我们打上了一个标记我们就可以检测到已经打上的时候就返回个true,进入if里面返回了一个异常 这样就终止了。这样做使的线程可以在我们可控的范围里停止
用什么方法去看什么状态呢
this.interrupted():看看当前线程是否是中断状态,执行后讲状态表示改为false this.isInterrupeted():看看线程对象是否已经是中断状态,但是不清除中断状态标记。
总结
以上就是本文关于Java多线程编程安全退出线程方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:浅谈Java多线程处理中Future的妙用(附源码)、Java多线程ForkJoinPool实例详解等,有什么问题可以随时留言,小编会及时回复大家的。下面推荐本站两本关于Java编程的书籍,供参考:
Java经典实例(第三版) 完整版 ([美]达尔文) 中文pdf扫描版
//www.jb51.net/books/577859.html
Java软件结构与数据结构(第4版) (John Lewis) 中文pdf扫描版
//www.jb51.net/books/568505.html
希望对大家有所帮助!
- 机器学习决策树:sklearn分类和回归
- 机器学习决策树:提炼出分类器算法
- 机器学习:XGBoost 安装及实战应用
- Ryu:如何在LLDP中添加自定义LLDPDU
- 机器学习|kaggle数据挖掘和求解的基本步骤
- mybatis_generator_逆向工程的使用笔记
- 纳税服务系统总结
- 纳税服务系统一(用户模块)【简单增删改查、日期组件、上传和修改头像】
- 纳税服务系统三(优化处理)【异常处理、抽取BaseAction】
- 机器学习|快速排序思想求topk
- 纳税服务系统二(用户模块)【POI、用户唯一性校验】
- 纳税服务系统四(角色模块)【角色与权限、角色与用户】
- 纳税服务系统五(登陆与系统拦截)【配置系统、子系统首页、登陆与拦截】
- 纳税服务系统六(信息发布管理模块)【Ueditor、异步信息交互、抽取BaseService、条件查询、分页】
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux查看进程的所有信息的方法示例
- 新版VPS主机管理面板WDCP安装及使用体验-国产简单易用型VPS面板
- linux中普通用户的定时任务详解
- 详解在Linux中清空或删除大文件内容的5种方法
- 教你一招实现Linux中的文本比对
- 怎么禁用 Ubuntu 服务器中终端欢迎消息中的广告
- Linux系统下部署项目的设置方法
- Linux中设置路由以及虚拟机联网图文详解
- 在Linux中如何一次重命名多个文件详解
- Vim自定义高亮分组以及一些实用技巧小结
- Linux redis-Sentinel配置详解
- 使用 Apache Web 服务器配置两个或多个站点的方法
- Linux下命令行cURL的10种常见用法示例
- Apache Web 服务器的安装配置方法
- Linux(Ubuntu 18.04)上安装Anaconda步骤详解