如果我对Thread.interrupt()的调用不起作用,如何正确停止一个线程?

众所周知,使用Thread.stop()不会停止运行进程。

通常手册和教程建议使用Thread.interrupt()或一些布尔变量,并从代码内部检查该中断或变量。

但是,如果我有一个库方法,有时需要很长时间才能执行,我想让用户有能力停止该过程? 而库并没有给我一个机制来做(不检查线程中断状态,没有“停止!”变量)?

而且,为了添加不好的东西,要么没有库的源代码,要么它太大而无法编辑它并在适当的位置添加检查。

似乎Thread.stop()是这里唯一的解决方案。 或者也许有一些解决方法?

如果在您的情况下实际可行,则生成另一个进程并将其视为工作单元而不是线程。 进程查杀更具确定性,但将过程用于线程的工作可能对您的情况来说太重了。

为什么你在等待某些条件时不尝试使用sleep(长时间超时),如果没有成功,你从线程中简单地“返回”?


可能你的线程运行了一段while (booleanVariable) { }

如果是,则可以将此变量设置为volatile,并且线程控制器将其设置为false。

想想Thread.stop()就像System.exit(value) ,它可以正常运行,但是当你有一些bug使你线程停止/ vm退出时,找到它会更加困难。

唯一比使用Thread.stop()更好的解决方案是在一个单独的线程中使用该库,你可以杀死它来阻止它。

您可能希望查找正在运行的函数的不同句柄,例如,如果其IO可以尝试关闭任何打开的连接/流。 如果你坚持使用这个库(IE找不到具有更好中断机制的那个),Thread.stop()是你停止线程的唯一方法。

从java 4开始不推荐使用Thread.stop()。我读了一篇文章,通过在一个实现InterruptibleChannel(它是java.nio的一部分)的单独类中包装对库的调用来停止一个线程。 Interruptibleclasses有close()方法,另一个线程可以异步调用它。