Java中终止线程的3种方法,你是否了解?

2023-10-29

一、stop 方法终止线程(线程不安全,不推荐)

直接使用thread.stop()来强行终止线程,线程会立即终止执行,可能会产生不可预料的结果。在调用thread.stop()后会导致该线程所持有的所有锁突然释放(不可控制),那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。因此,并不推荐使用 stop 方法来终止线程。

二、使用退出标志退出线程

public volatile boolean exit=false;
public void run() {
    while (!exit){
      //do something
    }
}

通过使用volatile修饰的boolean类型的共享变量,在设置exit等于true时,该运行中的线程会退出while循环,执行完run方法结束

volatile保证了可见性和防止指令重排

三、Interrupt方法结束线程

使用interrupt()方法来中断线程有两种情况:

  • 线程处于阻塞状态:如使用了sleep,wait,await,socket中的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,会抛出InterruptException异常,通过代码捕获该异常,然后break跳出循环状态,结束这个线程的执行。通常很多人认为只要调用interrupt方法线程就会结束,实际上是错的,一定要先捕获InterruptedException异常之后通过break来跳出循环,才能正常结束run方法。

public void run () {
    //非阻塞过程中通过判断中断标志来退出
    while (!Thread.interrupted()) {
        try {
            Thread.sleep(3 * 1000);
        } catch (InterruptedException e) {
            //捕获到异常之后,执行 break 跳出循环break;
        }
    }
}
  • 线程处于非阻塞状态:使用isInterrupted()判断线程的中断标志来退出循环。当使用interrupt()方法时,中断标志就会置true,和使用自定义的标志来控制循环是一样的道理。

Thread.currentThread().isInterrupted()和Thread.interrupted()的区别?
两者都是判断当前线程是否中断,isInterrupted()不会清除中断标志,interrupted()会清除掉中断标志。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中终止线程的3种方法,你是否了解? 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 两个应用程序之间的通信

    应用程序之间的数据交换 互相通讯 一直是困扰广大程序员的难题 尽管已经出现了各式各样的解决方案 但迄今为止没有哪一种方案是完美无缺的 因此 只有学习并了解了它们的优缺点后 才能在特定的情况下选择最佳方案 以满足最终的要求 1 共享 在硬盘上
  • 【Redis】使用Redis实现消息队列

    一 两个消息模型 队列模型 队列模型如图所示 它具有以下几个特点 就像我们用微信和好友 群聊除外 聊天一样 微信就是这个队列 我们可以和很多个好友聊天 但是每条消息只能发给一个好友 只有一个消费者将获得消息 生产者不需要在接收者消费该消息期
  • MobaXterm通过SSH隧道配置RDP端口转发

    MobaXterm通过SSH隧道配置RDP端口转发 2019年9月29日星期日 版本1 0 目的 解决校园网跨网段 不能远程访问 微软RDP协议 客户端mstsc 默认端口 3389 服务器的问题 1 首先在服务器 Ubuntu 16 04
  • Flask入门教程(1)-定义Flask

    本系列文章仅为入门教程 入门举例 01 6 第一个Flask程序 1 导入flask扩展 from flask import Flask escape url for 2 创建flask 应用程序实例 需要传入 name 作用是为了确定资源
  • JavaWeb 第一个Servlet程序

    1 Servlet Servlet是Java编写的用于Web应用程序的服务器端程序 它可以接收来自Web浏览器的HTTP请求并生成响应 Servlet通常用于创建动态Web内容 例如网页 表单处理 登录和数据库访问等 Servlet是Jav
  • python制作编程软件的方法_利用python程序生成word和PDF文档的方法

    一 程序导出word文档的方法 将web html内容导出为world文档 再java中有很多解决方案 比如使用Jacob Apache POI Java2Word iText等各种方式 以及使用freemarker这样的模板引擎这样的方式
  • 【nvidia】1.命令行方式安装nvidia显卡驱动

    文章目录 方法一 第一步 查询合适的显卡驱动 第二步 安装驱动 第三步 重启电脑并验证安装 方法二 第一步 安装显卡驱动PPA 第二步 查找合适的显卡驱动 第三步 移除系统上先前安装的显卡驱动 第四步 安装显卡驱动 第五步 重启电脑并验证安
  • 334:递增的三元子序列-中等

    题目描述 给定一个未排序的数组 判断这个数组中是否存在长度为 3 的递增子序列 数学表达式如下 如果存在这样的 i j k 且满足 0 i lt j lt k n 1 使得 arr i lt arr j lt arr k 返回 true 否
  • 长虹电视新机测试什么软件,2021长虹电视安装第三方app最新方法!长虹电视解除第三方限制...

    警告 最后再次提醒各位 刷机有风险 用户需谨慎 变成昂贵的大黑板了那可不好玩了 除非电视有问题需要刷机 否则不推荐各位进行刷机操作 正文 在一些新机器新版本固件当中 长虹为了缩短开机启动过程的时间 启用了新的刷机策略 和之前的都不一样了 这
  • 编程计算饥荒所有农作物搭配(JavaScript版)

    导语 通过编程计算饥荒游戏中 所有农作物可满足肥度自给自足的种植搭配 思路 穷举出所有农作物 包括生长季节 生长素 堆肥 肥料消耗数值等属性 后续如果版本更新或有MOD农作物需添加 在此处修改添加 const ALL CROPS name
  • 因果推断—现代统计的思想飞跃:过去、现在到未来(伯克利丁鹏博士万字长文)...

    来源 专知 本文约12400字 建议阅读10 分钟 本文将回顾统计因果推断的历史背景 评述中国因果推断研究的现状 并且大胆推测它未来的发展前景 转载自 数学文化 2021 第 12 卷第 2 期 已获得原刊和作者授权 引言 探求事物的原因
  • 华为OD机试 - 猜数字(Java)

    题目描述 一个人设定一组四码的数字作为谜底 另一方猜 每猜一个数 出数者就要根据这个数字给出提示 提示以XAYB形式呈现 直到猜中位置 其中X表示位置正确的数的个数 数字正确且位置正确 而Y表示数字正确而位置不对的数的个数 例如 当谜底为8
  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 作者主页 https www weiyigeek top 博客 https b
  • C# .Net中的类型转换(转载)

    转载自 http www ynws gov cn wsrs blog blogview asp logID 99 导读 本文是对 C 的类型转换的讲解 其内容涉及 C 的装箱 拆箱 别名 数值类型间相互转换 字符的 ASCII 码和 Uni
  • unity热更新框架Xlua--配置环境变量与直接执行字符串

    本博客根据51CTOscholl刘国柱老师网课编写 小白笔记 侵权必删 Xlua下载链接 https pan baidu com s 1YiCuojsE3uzZF7rLuIKYtw 提取码 t4xe 配置环境 将上面链接的压缩包解压 并将其
  • elementui 之el-table通过v-if 控制按钮显示与隐藏

    前端效果演示 后端代码
  • Git管理神器SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决,提交PR)...

    前言 俗话说的好工欲善其事必先利其器 Git分布式版本控制系统是我们日常开发中不可或缺的 目前市面上比较流行的Git可视化管理工具有SourceTree Github Desktop TortoiseGit 综合网上的一些文章分析和自己的日
  • Java 并发 ThreadLocal 详解

    文章首发于个人博客 欢迎访问关注 https www lin2j tech 简介 ThreadLocal 即线程本地变量的意思 常被用来处理线程安全问题 ThreadLocal 的作用是为多线程中的每一个线程都创建一个线程自身才能用的实例对
  • 凯利公式自动计算表_利用凯利公式计算每场投注的最佳比例

    即便是胜率 99 的赌局 如果每局全押 那么也注定会血本无归 即便是胜率只有 1 如果 1000 元钱本金每局仅投注 1 元 哪怕每次必输 也要 1000 次才会破产 成功的投资不仅要对投资策略的胜率具有一定程度的认识 同时要认真分析每一次
  • Java中终止线程的3种方法,你是否了解?

    一 stop 方法终止线程 线程不安全 不推荐 直接使用thread stop 来强行终止线程 线程会立即终止执行 可能会产生不可预料的结果 在调用thread stop 后会导致该线程所持有的所有锁突然释放 不可控制 那么被保护数据就有可