Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中杀死无限循环线程_Java_Multithreading_Infinite Loop - Fatal编程技术网

在java中杀死无限循环线程

在java中杀死无限循环线程,java,multithreading,infinite-loop,Java,Multithreading,Infinite Loop,是否有任何方法可以在不使用不推荐的stop()的情况下停止线程 线程从一个可能包含无限循环的写得很糟糕的类中调用一些方法。因为我不能修改这个类,所以我无法控制循环条件,因此无法使用interrupt()或任何其他变量正常退出。在这种情况下使用stop()是否合理?如果您无法使用stop()并且无法修复代码,那么您唯一的其他选择就是在另一个进程中运行代码并终止该进程 在您的情况下,最简单的选项是使用Thread.stop()如果您无法使用stop()并且无法修复代码,那么您唯一的其他选项是在另一个

是否有任何方法可以在不使用不推荐的stop()的情况下停止线程

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

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

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

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


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

方法
stop()
的问题是,它可能会使同步对象处于不一致的状态(即,如果在同步对象更新的中途停止线程,则只会更新对象的一部分)。如果线程未使用任何同步方法/块,则可以安全地停止它


如果您的线程可能正在使用同步块/方法,那么在调用
stop
之前,请尝试完全关闭它,例如对其调用
interrupt
,如果线程仍然没有停止,则在X分钟后调用
stop
(假设线程正在调用一个中断的方法)。只需确保线程在调用可能中断的方法之前将所有对象保持在一致状态。

方法的问题在于它可能使同步对象保持在不一致状态(即,如果在同步对象更新进行到一半时停止线程,则只能更新部分对象)。如果线程未使用任何同步方法/块,则可以安全地停止它


如果您的线程可能正在使用同步块/方法,那么在调用
stop
之前,请尝试完全关闭它,例如对其调用
interrupt
,如果线程仍然没有停止,则在X分钟后调用
stop
(假设线程正在调用一个中断的方法)。在调用可能已损坏的方法之前,请确保线程使所有内容保持一致状态。

请记住,即使
stop
也不能保证您的恶意线程将停止。一个简单的
尝试{…}catch(Throwable t){
将使线程无法阻止。我在这里迷路了。为什么try/catch会阻止我停止线程?
stop
只会在线程中抛出异常。异常处理的语义没有改变。请自己尝试:
thread t=new thread(){public void run(){for(;)try{System.out.println(“仍在运行”);Thread.sleep(100);}catch(Throwable t){};t.start();t.stop();
请记住,即使
stop
也不能保证您的恶意线程会停止。简单的
尝试{…}catch(Throwable t){
将使线程无法阻止。我在这里迷路了。为什么try/catch会阻止我停止线程?
stop
只会在线程中抛出异常。异常处理的语义没有改变。请自己尝试:
thread t=new thread(){public void run(){for(;)try{System.out.println(“仍在运行”);Thread.sleep(100);}catch(Throwable t){}};t.start();t.stop()
停止的问题不仅仅是同步块的问题,你只是在重复你在别处读到的内容。问题是异常可能出现在代码的任何一点上,即使是在
int i=1;
上,而大多数代码还没有准备好处理这个问题:它对异常可能发生和不可能发生的位置做出假设epeated
stop
然后会破坏处理程序代码,以此类推。
stop
的问题不仅仅是关于同步块,你只是在重复你在别处读到的内容。问题是,异常可能会出现在代码的任何一点上,即使是在
int i=1;
上,而大多数代码还没有准备好处理它:它使关于异常可以和不可以发生的位置的假设。重复的
stop
会破坏处理程序代码,依此类推。我认为如果线程不响应中断,它也不会响应stop…@assylias stop()触发ThreadDeath错误或您提供的任何可丢弃错误。虽然线程可以捕获并忽略它,但这相对不寻常,尤其是与不检查中断()相比,我认为如果线程不响应中断,它也不会响应停止…@assylias stop()触发ThreadDeath错误或您提供的任何可丢弃错误。虽然线程可以捕获并忽略它,但这相对不寻常,尤其是与不检查中断()相比