我怎样才能杀死一个线程?不使用 stop();

2023-12-31

Thread currentThread=Thread.currentThread();
        public void run()
        {               

             while(!shutdown)
            {                               
                try
                {
                    System.out.println(currentThread.isAlive());
                Thread.interrupted();

                System.out.println(currentThread.isAlive());
                if(currentThread.isAlive()==false)
                {
                    shutdown=true;
                }
                }
                catch(Exception e)
                {
                    currentThread.interrupt();
                }                   
            }
        }

    });
    thread.start();

调用 stop 的替代方法是使用中断向线程发出信号,表明您希望它完成正在执行的操作。 (这假设您要停止的线程表现良好,如果它在抛出 InterruptedExceptions 后立即将其吃掉,从而忽略它们,并且不检查中断状态,那么您将返回使用 stop()。)

这是我为回答线程问题而编写的一些代码here https://stackoverflow.com/questions/5097387/java-re-doing-a-piece-of-code-using-threads/5097597#5097597,这是线程中断如何工作的示例:

public class HelloWorld {

    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new Runnable() {

            public void run() {
                try {
                    while (!Thread.currentThread().isInterrupted()) {
                        Thread.sleep(5000);
                        System.out.println("Hello World!");
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
        thread.start();
        System.out.println("press enter to quit");
        System.in.read();
        thread.interrupt();
    }
}

需要注意的一些事项:

  • 中断原因sleep() and wait()立即抛出,否则你将陷入等待睡眠时间过去的状态。

  • 请注意,不需要单独的布尔标志。

  • 被停止的线程通过检查中断状态并在 while 循环之外捕获 InterruptedException(使用它来退出循环)来进行协作。中断是可以使用异常进行流量控制的地方,这就是它的重点。

  • 在 catch 块中的当前线程上设置中断从技术上讲是最佳实践,但对于本例来说有点矫枉过正,因为没有其他东西需要设置中断标志。

关于发布的代码的一些观察:

  • 发布的示例不完整,但将对当前线程的引用放入实例变量中似乎是一个坏主意。它将被初始化为创建对象的任何线程,而不是执行 run 方法的线程。如果同一个 Runnable 实例在多个线程上执行,则实例变量大多数时候不会反映正确的线程。

  • 检查线程是否处于活动状态必然总是导致 true(除非出现错误,其中 currentThread 实例变量引用了错误的线程),Thread#isAlive只有在线程完成执行后才为 false,它不会仅仅因为被中断而返回 false。

  • Calling Thread#interrupted将导致清除中断标志,并且在这里没有任何意义,特别是因为返回值被丢弃。打电话的要点Thread#interrupted是测试中断标志的状态然后清除它,这是抛出异常的东西使用的一种便捷方法InterruptedException.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我怎样才能杀死一个线程?不使用 stop(); 的相关文章

  • H2 - 多个应用程序访问同一个 H2 数据库

    我正在使用嵌入式数据库H2在 2 个网络应用程序中说WebApp1 and WebApp2 我运行 WebApp1 并执行一些查询来访问 H2 数据库 同时我运行 WebApp2 但它抛出异常H2 当前已被另一个进程使用 我的需求是 我应该
  • 在 Windows 7 中,不从命令行强制终止 JVM

    我在 JVM 中运行了 Cobertura 仪器化 jar 当我在运行应用程序的 Windows 控制台中按 Ctrl C 时 JVM 结束并Cobertura 结果已成功刷新到 cobertura ser 文件 但我需要使用命令 工具 不
  • spring boot框架下如何过滤tomcat产生的访问日志

    我们使用spring boot框架 通过嵌入式tomcat生成访问日志 访问日志的格式如下 server tomcat access log enabled true server tomcat access log pattern h l
  • 如何解析比 Java 中 NumberFormat 更严格的数字?

    我正在验证表单中的用户输入 我解析输入NumberFormat http docs oracle com javase 7 docs api java text NumberFormat html 但它是邪恶的 几乎允许任何事情 有没有办法
  • Eclipse 说“更新 Android Developer Toolkit”

    我不知何故弄乱了我的 Eclipse 和 Android 设置 我不知道如何修复它 问题症状如下 在 首选项 gt Android 中 我尝试选择 android sdk linux 的位置 选择时出现错误 此 Android SDK 需要
  • SwingWorker 在 Unsafe.park() 处挂起

    我有一个SwingWorker与后台服务器通信 然后更新JFrame 我正在调试我的应用程序并注意到即使在SwingWorker完成了它的工作 它的线程仍然存在 它挂在Unsafe park java lang Object 这是一个本机方
  • 在 Eclipse 中导航 Java 调用堆栈

    在调试器中像GDB http sources redhat com gdb 当您在断点处停止时 您可以轻松地向上移动调用堆栈并检查相关的源和堆栈帧数据 在 Eclipse 中如何做到这一点 In the 调试视角 http www ibm
  • 如何在Android Studio中关联.mp3文件

    我想根据列表视图项单击播放 mp3 文件 但是根据我的代码 我运行我的应用程序 出现此窗口 因此由于缺少音频选项 我真的不知道需要选择其中哪一个为了关联我的 mp3 文件 mainList setOnItemClickListener ne
  • boost::asio::io_service 是否保留处理程序的顺序?

    Does boost asio io service http www boost org doc libs release doc html boost asio reference io service html保证处理程序的调用顺序与
  • Hibernate3:自引用对象

    需要一些帮助来了解如何执行此操作 我将在文件系统上运行递归 查找 并且希望将信息保留在单个数据库表中 具有自引用的层次结构 这是我想要填充的数据库表结构 目录对象表 id int NOT NULL name varchar 255 NOT
  • Spark toLocalIterator 和迭代器方法之间的区别

    在编写 Spark 程序时我遇到了这个toLocalIterator 方法 之前我只使用iterator method 如果有人曾经使用过这种方法 请点亮 我在使用时遇到foreach and foreachPartitionSpark程序
  • 获取运行时生成的类的字节

    我正在使用一个 Java 框架 该框架使用自定义类加载器在运行时生成一些 代理 类 我想为任何这样的类获取自定义 ClassLoader 从 loadClass 返回的与该类对应的原始字节数组 这可能吗 我知道 如果一个类作为资源存在 那么
  • 将 Class 对象转换为字节

    如果我有一个Class http java sun com j2se 1 5 0 docs api java lang Class html在运行时实例 我可以获得它的 byte 表示形式吗 我感兴趣的字节将在类文件格式 http java
  • Spring @Configuration如何缓存对bean的引用

    使用基于 Java 的配置时 Spring 如何防止再次调用 bar 我想知道编译时注释处理或通过代理方法 Configuration public class AppConfig Bean public Foo foo return ne
  • 如何根据服务器/环境动态加载服务器配置?

    目前 我设置了 Maven 配置文件 以便能够为不同的环境 开发 演示 暂存 生产等 部署我的项目 并且它工作得很好 但问题是 对于我拥有的每个模块 Web 应用程序 我需要复制 粘贴此配置文件 它们都是属性文件 当我需要更改环境 服务器配
  • bean 中的 Spring JavaConfig 属性未设置?

    我正在考虑将 Spring JavaConfig 与一些属性文件一起使用 但 bean 中的属性未设置 bean 中的属性未设置 这是我的网络配置 Configuration EnableWebMvc PropertySource valu
  • LinkedBlockingQueue 抛出 InterruptedException

    我有这段代码 ALinkedBlockingQueue应该只抛出一个Exception如果在等待添加到队列时被中断 但这个队列是无限的 所以它应该尽快添加 为什么我的关闭方法会抛出一个InterruptedException private
  • 使用 JPA 和 Hibernate 时 DISTINCT 如何工作

    DISTINCT 在 JPA 中使用什么列 是否可以更改它 以下是使用 DISTINCT 的 JPA 查询示例 select DISTINCT c from Customer c 这没有多大意义 不同的列是基于哪一列 它是否在实体上指定为注
  • 如何使用SAXReader解析GPX文件?

    我正在尝试解析GPX file http en wikipedia org wiki GPS eXchange Format 我用 JDOM 尝试过 但效果不太好 SAXBuilder builder new SAXBuilder Docu
  • 如何使用 JRE 部署 JavaFX 11 桌面应用程序

    我有一个 JavaFX JDK 8 桌面业务应用程序 它使用 Java Web Start 进行部署 用户安装了 Java 8 只需访问 URL 我的 AWS Linux 服务器上的公共 URL 即可下载 启动应用程序 使用 Web Sta

随机推荐

  • 如何避免在 C 或 C++ #include 指令中显式声明目录路径?

    我正在制作一个模拟器并编写了很多文件和标头 问题是每当我包含一个文件时 我都会给出特定文件的相对路径 例如 我的应用程序中的典型代码将像这样开始 ifndef AI H define AI H include
  • 从筛选列表和循环中将多个文件附加到 Outlook 电子邮件 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一份包含发票数据的客户列表 一个客户可能有一行或多行数据 我已经用多个代码组装了一个宏脚本来过滤掉客户 根据电子邮件
  • iOS 构建/ipa 创建不再通过命令行进行

    Overview 我们的命令行构建 构建和创建 ipa 不再起作用 iTunesConnect 已开始拒绝使用CODE SIGN RESOURCE RULES PATH构建设置 如果我们在没有设置的情况下进行构建 PackageApplic
  • Canny 边缘算法中只需要一条边

    当我使用精明边缘算法时 它会按预期产生与粗彩色线相对的 2 条边缘 但我只想显示一条边缘 以便使我的直线和曲线检测算法变得不那么复杂 关于如何做的任何想法让这一切发生 这是代码 bool CannyEdgeDetection DataStr
  • 调整大小触发函数一次,直到条件为 True 或 False

    我正在努力寻找解决方案 请需要一些帮助 这是一个简单的示例 function ifTrueInitiateOnce console log True function should be initiated triggered Once f
  • 获取当前文件的路径

    如何获取 java文件所在的目录 我不想使用System getProperty user dir 因为这给了我可执行文件的目录 而不是包含这行代码的 java 文件的目录 我需要这个 因为我正在开发一个 JSP Web 应用程序 并且 J
  • Swift 3 中的 NSBatchDeleteRequest 仅适用于 iOS 10?

    因此 将我的代码迁移到Swift 3让我有点卡住了 它似乎NSBatchDeleteRequest需要iOS 10现在 我构建代码的唯一方法是使用以下代码片段 func removeAllChargerData Remove all cha
  • 有什么方法可以检查 kafka 是否已从 kafka-net 启动并运行

    我正在使用 kafka net 客户端向 kafka 发送消息 我只是想知道是否有任何方法可以检查 kafka 服务器是否启动并且可以接收消息 我关闭了kafka 但生产者已成功创建 而SendMessageAsync只是冻结了相当长的时间
  • 从 Oracle 中的日期获取月份名称

    如何从 Oracle 中的给定日期获取月份名称 如果给定日期是 15 11 2010 那我想要November从这个日期开始 select to char sysdate Month from dual 在你的例子中将是 select to
  • 如何使函数对可选值序列进行操作?

    在 Swift 中如何指定一个函数应该对一系列可选值进行操作 例如 我想创建一个像这样的函数 它适用于可选值数组和序列 Given an array of optional values return the first one with
  • Spring MVC 支持 JSR 311 注释吗?

    在帮助别人时 我注意到他们正在尝试使用 Spring 开发 GET Consumes and Path注释 据我了解 这些注释来自 JSR 311 规范 我只是建议他们使用 Spring RequestMapping用于将端点映射到其控制器
  • 如何在powershell中实现using语句(块)?

    如何在 PowerShell 中编写 using 块 这是 C 中的一个工作示例 using var conn new SqlConnection connString Console WriteLine InUsing 我在 PowerS
  • 如何在 Snowflake 中使用带有空值的 GREATEST() ?

    我正在尝试使用GREATEST 在雪花中 但每当我有空值时 我就会得到null而不是期望的结果 select greatest 1 2 null null 这种行为让很多人感到困惑 这要从以下行为开始 GREATEST 在 Oracle 中
  • 从输入中删除最后一个字符

    如何从 JQuery 的输入中删除最后一个字符 例如 onclick某些东西 它从输入字段中删除最后一个字符 在我的例子中是逗号 input val function index value return value substr 0 va
  • Ruby on Rails 关于 Activerecord 关联的引导文件不正确?

    哇 我一整天都在努力解决这个问题 遵循 官方 Ruby on Rails 指南文档 然后发现我可能一直被该文档误导 我只是想确认一下这是否属实 如果你去http guides rubyonrails org association basi
  • 推力:填充隔离空间

    我有一个像这样的数组 0 0 010 0 0 05 0 0 3 0 0 0 8 0 0 我希望每个非零元素一次扩展一个元素 直到它到达其他非零元素 结果是这样的 1 1 111 1 5 55 5 3 3 3 3 8 8 8 8 有什么办法可
  • Excel VBA代码中函数

    我有以下字符串 123 456789 我想做的是找到一种方法来仅捕获第二个空格之后的剩余字符 456789 无论字符串的长度如何 我有以下一组代码 For leftLoop 2 To leftNumberOfCells Range A iR
  • 如何在java中实现循环双向链表add方法

    我正在循环 DoublyLinkedList 类以及 Node 内部类中实现 add E 方法 Node 应作为私有内部类实现 DoublyLinkedList 的 first 属性应指向列表中的第一个节点 它的 size 属性应该存储列表
  • 如何使用getch()而不等待输入?

    for cout lt lt You are playing for lt lt playtime lt lt seconds lt lt endl cout lt lt You have lt lt bytes lt lt bytes l
  • 我怎样才能杀死一个线程?不使用 stop();

    Thread currentThread Thread currentThread public void run while shutdown try System out println currentThread isAlive Th