【问题标题】:Killing a Java thread by throwing exception通过抛出异常杀死 Java 线程
【发布时间】:2014-12-03 07:46:24
【问题描述】:

我认为在您想要的时间杀死thread 对许多人来说是个问题。我最近遇到了一种通过抛出exception 来杀死thread 的方法。您对此有何想法/意见?以前有没有人实现过类似的东西?

【问题讨论】:

  • 你从哪里知道杀死一个线程对很多人来说是个问题?
  • 您可以使用/调用 Thread.interrupt() 方法来终止线程。
  • @RakeshSoni 不,你不能(至少不是任何给定的线程),但你可以使用Thread.stop()。问题是,你不应该这样做。
  • 请注意 thread.stop() 已被弃用。
  • @RakeshSoni 它已被弃用,意味着不应使用它。这并不意味着它不起作用。

标签: java multithreading exception kill-process


【解决方案1】:

停止线程的最佳方法是在线程内抛出InterruptedException。如果抛出异常,这会确保 catchfinally 块被执行,因此线程能够释放锁和资源,关闭它打开的文件和连接等。

通常你想从另一个线程中停止一个线程。您应该使用Thread.stop() 方法,因为它会立即停止线程,导致当关闭的线程仍然拥有锁时出现死锁,文件永远不会关闭等。“官方”停止方式一个线程就是在要停止的线程上调用interrupt()方法。这会设置一个内部标志,可以通过Thread.interrupted() 进行检查。每个线程现在应该在方便的时候轮询Thread.interrupted(),如果设置了标志,则抛出InterruptedException

if (Thread.interrupted()) throw new InterruptedException();  

【讨论】:

  • 从 cmets 中,您应该已经意识到 OP 的问题正是他无法保证要停止的线程到达“方便时间”的地步。
  • @ErwinSmout。真的吗?我看到 OP 的一条评论,1)是在我输入答案时添加的,所以我之前没有读过,2)似乎没有说出你声称的内容,只是他想要这个线程停止“在精确的时间”。关键是,您不能在准确的时间安全地停止线程,因为您需要给线程时间来清理,任何好的答案都应该指出这一点。
【解决方案2】:

你不应该杀死一个线程。你应该让它停下来。如果你有一个循环,你应该停止这个循环。如果你有一些耗时的功能,比如网络连接,你应该停止这个网络功能而不是杀死线程。无法保证使用Thread.stop() 函数停止线程

【讨论】:

  • Thread.stop() 会很好地停止线程(除非安全管理器阻止它)。只是对它不是很温柔。
  • 可能是这样。但函数本身已被弃用。这意味着,你不应该使用它。甚至,可以在某个时候从 jre 中删除该函数。 10kloc.wordpress.com/2013/03/03/…
  • 没错,你不应该使用它,因为它有问题。然而,它不太可能被删除(即使理论上它可能是)。这样做弊大于利。
  • 那么当你需要在一个精确的时间停止一个线程的时候你会怎么做呢?
  • Thread.stop() 是唯一的方法,如果线程无论如何都要立即取消。你最好准备好应对这种“无论如何”的后果。
猜你喜欢
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多