众所周知,使用Thread.stop()不会停止运行进程。
通常手册和教程建议使用Thread.interrupt()或一些布尔变量,并从代码内部检查该中断或变量。
但是如果我有一个库方法,有时需要很长时间才能执行,我想让用户有能力停止这个过程?并且库没有给我一个机制来执行它(不检查线程中断状态,没有“停止!”变量)?
而且,为了添加不好的东西,没有库的源代码,或者它太大了,无法编辑它并在适当的地方添加检查。
似乎Thread.stop()是这里唯一的解决方案。或者可能有一些解决方法?
答案 0 :(得分:4)
为什么你在等待某些条件时不尝试使用sleep(长时间超时),如果没有成功,你从线程中简单地“返回”?
您的主题可能正在while (booleanVariable) { }
,
如果是,则可以将此变量设置为volatile,并且线程控制器将其设置为false。
将Thread.stop()
想象为System.exit(value)
,它可以正常工作,但是当你有一些错误让你停止/退出时,将会更难找到它。
答案 1 :(得分:3)
如果在您的情况下实际可行,则生成另一个进程并将其视为工作单元,而不是线程。进程查杀更具确定性,但是将进程用于线程的工作可能对您的情况来说太重要了。
答案 2 :(得分:1)
唯一比使用Thread.stop()更好的解决方案是在一个单独的线程中使用该库,你可以杀死它来阻止它。
答案 3 :(得分:1)
您可能希望查找正在运行的函数的不同句柄,例如,如果其IO可以尝试关闭任何打开的连接/流。如果你坚持使用这个库(IE找不到具有更好中断机制的那个),Thread.stop()是你停止线程的唯一方法。
答案 4 :(得分:0)
从java 4开始不推荐使用Thread.stop()。我读了一篇文章,通过在一个实现InterruptibleChannel(它是java.nio的一部分)的单独类中包装对库的调用来停止一个线程。 Interruptibleclasses有close()方法,另一个线程可以异步调用它。