多线程的终止方法

多线程的终止共有3种方法

  1. run方法执行结束,正常退出
  2. 异常终止
  3. 暴力终止

停止线程


停止线程是多线程中的一个重要技术点,本篇文章将对线程的停止操作进行详细讲解。

Thread类中是有一个方法 interrupt() ,虽然该方法命名为“终止”,但是它并不会立马终止当前线程,它只令当前线程终止状态为true。

停止线程不能像for或while循环中使用break停止那样直接,而是需要一些技巧来终止。

如何判断线程已终止


Thread类中提供了两个方法:

  • public static boolean interrupted()
  • public boolean isInterrupted()

两者的区别如下:
interrupted方法是测试当前线程是否已经中断,当前线程指运行该方法的线程。执行后具有将状态标志清除为false的功能。也就是说在第一次调用成功停止之后,第二次调用该方法就会返回false。
isInterrupted方法是测试线程Thread对象是否已经是中断状态,但不清除状态标志。

异常终止


这个方法的意思就是在判断到线程终止标志为真后,抛出异常终止当前线程。
示例代码如下:

public class Test {public static void main(String[] args) {try {MyThread thread = new MyThread();thread.start();Thread.sleep(1000);thread.interrupt();} catch (InterruptedException e) {e.printStackTrace();}}
}
public class MyThread extends Thread {@Overridepublic void run() {try {for (int i = 0 ; i < 1000000 ; i++) {if (this.interrupted()) {System.out.println("为停止状态!线程退出!");throw new InterruptedException();}System.out.println("i -- " + i);}System.out.println("for 循环之下的代码");} catch (InterruptedException e) {System.out.println("进入catch代码块,线程结束执行正常");e.printStackTrace();}}
}

运行结果如下:

我们可以看到,线程成功中止。

暴力终止


暴力终止其实就是使用Thread类中的 stop() 方法,这种终止线程的方法是直接终止当前线程,有安全隐患。
示例代码:

public class Test {public static void main(String[] args) {try {MyThread thread = new MyThread();thread.start();thread.sleep(100);thread.stop();System.out.println("finished");} catch (InterruptedException e) {e.printStackTrace();}}
}
public class MyThread extends Thread {@Overridepublic void run() {for (int i = 0 ; i < 1000000 ; i++) {System.out.println("i -- " + i);}}
}

运行结果:

我们会发现这里System.out.println("i – " + i);语句甚至都没有执行结束,我的线程就已经结束并回到了主方法中执行后续语句了。

暴力终止出现的问题


stop()方法会抛出java.lang.ThreadDeath异常

通常情况下可以不显式地捕捉此异常,下面是测试项目:

public class Test {public static void main(String[] args) {MyThread thread = new MyThread();thread.start();}
}
public class MyThread extends Thread {@Overridepublic void run() {try {this.stop();} catch (ThreadDeath e) {System.out.println("抛出ThreadDeath");e.printStackTrace();}}
}

stop()方法会对锁定对象“解锁”

使用 stop() 会释放锁,而释放锁将会对数据造成不同步的非线程安全问题,如果出现此现象,程序处理的数据就会被破坏,最终导致程序出错。这里博主就不演示了,大家记住就好,stop方法也在JDK中已经被标注过期,因此我们在开发时也不会使用这个方法来进行线程终止的操作。

使用return终止线程


结合interrupt()和return是可以有效终止线程的,但是不提倡使用这个方法,代码中可能出现多个return,逻辑有可能会变得复杂,最重要的是这样会造成污染。

总结


由上面的例子我们可以得出,在项目开发的过程中,如果有要对线程进行终止操作的需求时,尽可能地去使用interrupt()方法+抛异常的方法进行终止线程,其他的方法一般都不推荐,毕竟其他方法多多少少都是有些问题的。

多线程的终止方法(停止线程)相关推荐

  1. [改善Java代码]不使用stop方法停止线程

    线程启动完毕后,在运行可能需要终止,Java提供的终止方法只有一个stop,但是不建议使用此方法,因为它有以下三个问题: (1)stop方法是过时的 从Java编码规则来说,已经过时的方式不建议采用. ...

  2. 为什么不要用stop方法停止线程?

    线程启动完毕后,在运行时可能需要终止,Java提供的终止方法只有一个stop,但是我不建议使用这个方法,因为它有以下三个问题:(1)stop方法是过时的从Java编码规则来说,已经过时的方法不建议采用 ...

  3. 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)

    一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...

  4. 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )

    1.线程的状态转换 1.1 新建(New) 创建后尚未启动 1.2 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片. 包含了操作系统线程状态中的 Running 和 Read ...

  5. 停止线程 暂停线程

    停止线程 停止一个线程意味着在线程处理完任务之前停止正在进行的操作,即放弃当前的操作. Java中有以下3中方法可以终止正在运行的线程: 使用退出标志,使线程正常退出(当run方法完成后线程终止) 使 ...

  6. 【面试:并发篇09:多线程:interrupt 方法详解】

    [面试:并发篇09:多线程:interrupt 方法详解] 00.前言 如果有任何问题请指出,感谢. 01.介绍 程序中,有些线程的中断需要外部干预,比如线程中存在while(true)循环,或者存在 ...

  7. 你真的会停止线程吗?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 作者:Greta Wang 出处:http: ...

  8. 测试停止线程(Java)

    测试停止线程(Java) 1.建议线程正常停止->利用次数,不建议死循环 2.建议使用标志位->设置一个标志 3.不要使用stop或者destroy等过时或者JDK不建议使用的方法 pac ...

  9. python线程暂停_关于多线程:如何使“停止”按钮终止已经在Tkinter中运行的“开始”功能(Python)...

    我正在使用带有两个主要按钮的Tkinter制作GUI:"开始"和"停止". 您能否为以下代码提供建议,以使"停止"按钮终止由"开始 ...

最新文章

  1. rust 官服指令_RUST 命令大全(包括服务器指令)
  2. RenderingHints 参数
  3. 云炬WEB开发教程2-2 node.js和npm介绍和安装
  4. Angular Change Detection 的学习笔记
  5. 零空间,Markov‘s inequality, Chebyshev Chernoff Bound, Union Bound
  6. bi导入数据失败 power_主机数据库平台迁移 6 个典型问题
  7. pytorch torch.load
  8. Python pip安装报错及解决办法:is not a supported wheel on this platform
  9. vue插件大全汇总,你要的都这里,赶紧收藏下!
  10. 9.2.4闭包及候选键求解方法
  11. java 大于或等于_java大于等于怎么表示
  12. 基于SVM的中文垃圾短信分类
  13. Android 360开源全面插件化框架RePlugin 实战
  14. Python爬取58同城租房数据,完美解决字体加密
  15. 【vlan间通信的小玩法】在三层交换机上做ospf
  16. 金属结构保温板的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. 全球及中国碳化硅陶瓷膜市场需求预测与竞争对手分析报告2021~2026年
  18. PMP成本管理中的几个英文缩写
  19. 过去分词表完成或者被动完成
  20. 开源PLM软件Aras详解六 角色与用户以及权限

热门文章

  1. 从朴素贝叶斯的角度推导logistic模型
  2. 排位赛[USACO20JAN]Loan Repayment(二分+数学)
  3. 如何使用if嵌套结构;实现用户输入个人的身高和体重,计算出国际肥胖指标BMI值,并判断输出您属于 哪种体型
  4. java数据类型有哪些(给博主倒一杯卡布奇诺)
  5. iPhoneXS Max 获取UDID
  6. MySQL 8.0初体验
  7. antdesign+vue额外展开行expandedRowRender全部展开,并隐藏expandIcon展开收起按钮;antdesign表格嵌套表格
  8. 【转】模糊测试(fuzzing)是什么
  9. 20天从入门到项目实战:学习小组C1任务训练实录
  10. 彼泽清陂nbsp;菡萏悠悠