【问题标题】:Kill an infinite-loop thread in java在java中杀死一个无限循环线程
【发布时间】:2013-08-04 17:39:16
【问题描述】:

有什么方法可以在不使用已弃用的 stop() 的情况下停止线程?

线程从可能包含无限循环的可能写得不好的类中调用一些方法。由于我无法修改此类,因此我无法控制循环条件,因此无法使用 interrupt() 或任何其他变量正常退出。在这种情况下使用 stop() 是否合理?

【问题讨论】:

  • 请记住,即使stop 也不能保证您的恶意线程会停止。一个简单的try {...} catch (Throwable t) {} 将使线程无法停止。
  • 我迷路了。为什么 try/catch 会阻止我停止线程?
  • stop 除了在线程中抛出异常外,什么也不做。异常处理的语义没有改变。自己试试吧:Thread t = new Thread() { public void run() { for (;;) try { System.out.println("Still running"); Thread.sleep(100); } catch (Throwable t) {} } }; t.start(); t.stop();

标签: java multithreading infinite-loop


【解决方案1】:

如果您无法使用 stop() 并且无法修复代码,则唯一的选择是在另一个进程中运行代码并终止该进程。

在您的情况下,最简单的选择是使用 Thread.stop()

【讨论】:

  • 我认为如果一个线程不响应中断它也不响应停止...
  • @assylias stop() 触发 ThreadDeath 错误或您提供的任何 Throwable。虽然线程可以捕获并忽略它,但这是相对不寻常的,尤其是与不检查中断()相比
【解决方案2】:

stop() 方法的问题在于它会使同步对象处于不一致的状态(即,如果您在同步对象更新进行到一半时停止线程,则可能只更新部分对象) .如果您的线程没有使用任何同步方法/块,那么stop 它是安全的。

如果您的线程可能正在使用同步块/方法,请在调用 stop 之前尝试彻底关闭它,例如调用interrupt,然后在X分钟后调用stop,如果线程仍然没有停止(假设线程正在调用一个损坏的方法)。只需确保线程在调用可能损坏的方法之前将所有内容保持在一致状态即可。

【讨论】:

  • stop 的问题不仅仅是同步块,你只是在重申你在别处读到的内容。问题是异常可能出现在代码的任何位置,即使在int i = 1;,并且大多数代码还没有准备好处理它:它假设异常可以和不能发生的位置。重复的stop 会破坏处理程序代码,依此类推。
猜你喜欢
  • 2011-03-30
  • 2016-02-29
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
相关资源
最近更新 更多