当前位置: 首页 > 面试题库 >

如何优雅地停止Java线程?

祁曦哲
2023-03-14
问题内容

我写了一个线程,它花费太多时间执行,而且似乎还没有完全完成。我想优雅地停止线程。有什么帮助吗?


问题答案:

做到这一点的好方法是让run()一个线程保护一个Thread的boolean变量,并true在你要停止它的时候将其设置为外部变量,例如:

`class MyThread extends Thread
{
volatile boolean finished = false;

public void stopMe()
{
finished = true;
}

public void run()
{
while (!finished)
{
//do dirty work
}
}
}`

曾有一种stop()方法存在,但正如文档所述

这种方法本质上是不安全的。使用Thread.stop停止线程会导致它解锁所有已锁定的监视器(由于未经检查的ThreadDeath异常会在堆栈中传播)。如果先前由这些监视器保护的任何对象处于不一致状态,则损坏的对象将变为其他线程可见,从而可能导致任意行为。

那就是为什么你应该有个警卫。



 类似资料:
  • 问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是强行杀死(或),然后它们将不会执行。

  • 我在eclipse(java main method program)中运行一个脚本,它创建线程,每个线程处理一个excel表,然后将处理后的数据保存到数据库中。它已经处理数据2天了,今天突然我从excel处理完每条记录后打印的日志停止了。 我的代码的编写方式是,在处理完一个完整的工作表后,它将一条状态消息写入excel工作表记录中。这部分代码是在finally块中编写的。我一直在等待程序自行终止

  • 问题内容: 有没有一种方法可以优雅地停止和及其相关联的。 我正在努力实现的目标。 停止使用消息。 优雅地停下来。 等待长期运行的消费者,并在完成后确认。 我可以停止使用,但是长期运行的使用者不会成功完成,并且一旦ListenerContainer恢复后,已处理的消息也不会被确认,因此将再次进行处理。 输出量 邮件已处理,但未确认。 我也许可以使用来实现正常关机,但是是否可以验证被取消的使用者是否已

  • 不论是什么类型的应用,都会希望在服务停止前能够收到停止通知,有一定的时间做退出前的释放资源、关闭连接、不再接收外部请求等工作。我们对所有应用的优雅停止配置提供了一个全面指导,也提供了每种类型服务,从开发到部署到应用引擎v2的测试优雅停止功能的完整流程。 容器优雅停止最简单办法 当退出容器前,会将容器从服务提供列表中移除,使得外部请求不再打在其上,同时执行退出前可执行Hook。 在这里,我们设置在停

  • 问题内容: ,正如上面问题中回答的那样,我现在有一个maven-antrun-plugin,它可以分叉一个子进程并使用类似的配置来运行我的java appserver- 上面的配置作为后台进程顺利启动了我的appserver。 现在,我的问题是,有没有一种简便的方法可以定位此过程并在构建完成后根据需要停止该过程。 问题答案: 您可以使用JDK中捆绑的实用程序来获取正在运行的Java可执行文件的进程

  • 本文向大家介绍Dubbo如何优雅停机?相关面试题,主要包含被问及Dubbo如何优雅停机?时的应答技巧和注意事项,需要的朋友参考一下 Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用 kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。