当前位置: 首页 > news >正文

停止线程的方法

原理介绍

使用interrupt来通知,而不是强制。

如何正确的停止线程

  • 通常线程会在什么情况下停止
    run方法执行完毕;出现异常且未捕获;

  • 正确的停止方法:interrupt请求停止线程

    • 通常情况(run方法内没有sleep或wait等会造成阻塞的方法)
      通过thread.interrupt()中断线程,然后通过Thread.currentThread().isInterrupted()判断是否中断线程。
      在这里插入图片描述

    • 线程可能阻塞
      阻塞时用interrupt停止线程是通过抛出InterruptedException来停止
      注:在抛出InterruptedException后会清除掉Thread.currentThread().isInterrupted()标记位。

    • 在while内try/catch会无法停止,需要包住while

  • 实际开发中两种最佳实践

    • 优先选择:传递中断。将出现的InterruptedException不用try/catch处理,而是传递给run方法处理。
    • 不想或者无法传递:恢复中断。在捕获InterruptedException的catch语句中通过Thread.currentThread().isInterrupter()重新设置中断。
      不应该屏蔽中断:即不应该既不将异常传递给run方法也不重新设置中断。
  • 响应中断的方法

    1. Object.wait()常用
    2. Thread.sleep()常用
    3. Thread.join()常用
    4. java.util.concurrent.BlockingQueue.take()/put(E)阻塞队列
    5. java.util.concurrent.locks.Lock.lockInterruptibly()锁
      。。。

错误的停止方法

  • stop()方法:已过时。该方法具有固定的不安全性。用 Thread.stop() 来终止线程将释放它已经锁定的所有监视器。会导致线程运行一半突然停止,没办法完成一个基本单位的操作,造成脏数据。
  • suspend和resume:挂起不会释放锁,容易造成死锁。
  • volatile boolean变量控制停止:待停止的线程内部发生了阻塞会导致volatile变量无法停止线程。

停止线程相关重要函数

  • static boolean interrupted():检测当前线程是否被中断,会清除线程中断状态
  • boolean isInterrupted():同上,调用同一个函数,但是不会清除线程中断状态。
  • Thread.interrupted():看调用该语句的线程是否中断。

面试题:

  • 如何停止线程:

    1. 原理:用interrupt来请求。可以保证数据安全而且适用于阻塞场景。
    2. 一个线程调用interrupt,被中断的线程配合:请求方发出请求信号、被停止方检查中断信号并在可能出现InterruptedException的地方处理信号、子方法被调用方向上抛出异常或者再次设为中断状态。
    3. 错误:stop/suspend过时:数据安全与死锁。volatile的boolean无法处理长时间阻塞的情况。
  • 如何处理不可中断阻塞
    没有通用方法,针对不同的场景使用不同的方法

相关文章:

  • java计算机毕业设计计算机专业在线学习评估软件-演示录像-源码+数据库+系统+lw文档+mybatis+运行部署
  • STM32Cube学习(2)——定时器中断
  • jenkins安装部署(前端+后端)自动发布
  • docker logs 命令
  • 数据结构和算法-全文总结
  • 漏洞复现-CVE-2022-1388命令执行F5 BIG-IP iControl REST
  • labelme标注及标签的统一
  • 日常开发中比较使用的命令行
  • 项目管理证书 PMP 的含金量高吗?
  • RS笔记:深度推荐模型之多任务学习PLE模型 [RecSys 2020 最佳论文 腾讯]
  • 好用的word插件汇总
  • Flutter学习笔记 —— 完成一个简单的新闻展示页
  • pytorch 常见的网络层(卷积层,池化层,线性层,激活函数)
  • java计算机毕业设计计算机系教师教研科研管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  • Redis持久化机制
  • 78. Subsets
  • git 常用命令
  • HTML5新特性总结
  • PAT A1120
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 机器学习 vs. 深度学习
  • 解决iview多表头动态更改列元素发生的错误
  • 解析 Webpack中import、require、按需加载的执行过程
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 老板让我十分钟上手nx-admin
  • 目录与文件属性:编写ls
  • 想写好前端,先练好内功
  • 一个项目push到多个远程Git仓库
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 字符串匹配基础上
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 你对linux中grep命令知道多少?
  • 正则表达式-基础知识Review
  • ​ssh免密码登录设置及问题总结
  • ​VRRP 虚拟路由冗余协议(华为)
  • # 透过事物看本质的能力怎么培养?
  • ######## golang各章节终篇索引 ########
  • (07)Hive——窗口函数详解
  • (31)对象的克隆
  • (33)STM32——485实验笔记
  • (4)Elastix图像配准:3D图像
  • (Python第六天)文件处理
  • (第一天)包装对象、作用域、创建对象
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (转)大道至简,职场上做人做事做管理
  • (转)为C# Windows服务添加安装程序
  • .chm格式文件如何阅读
  • .NET多线程执行函数
  • .NET与 java通用的3DES加密解密方法
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • ??myeclipse+tomcat
  • @NestedConfigurationProperty 注解用法
  • [ Linux Audio 篇 ] 音频开发入门基础知识