你怎么java.lang.Thread
在Java中杀了?
请参阅Sun关于他们弃用的原因Thread.stop()
.它详细说明了为什么这是一个糟糕的方法以及应该采取什么措施来安全地停止线程.
他们推荐的方法是使用共享变量作为标志,要求后台线程停止.然后,该变量可以由请求线程终止的不同对象设置.
一般你不..
你要求它使用Thread.interrupt()(javadoc链接)中断它正在做的事情
这里有一个很好的解释为什么在javadoc (java技术说明链接)
在Java中,线程不会被杀死,但是线程的停止是以合作的方式完成的.要求线程终止,然后线程可以正常关闭.
通常使用一个volatile boolean
字段,当该字符被设置为相应的值时,该字段定期检查并终止.
我不会用a boolean
来检查线程是否应该终止.如果您使用volatile
的场调节剂,这将工作可靠,但如果你的代码变得更加复杂,对于而是使用内的其他阻止方法while
循环,它可能发生,你的代码将不会终止所有或至少需要更长的时间,你可能想要.
某些阻塞库方法支持中断.
每个线程都有一个布尔标志中断状态,你应该使用它.它可以像这样实现:
public void run() { try { while (!interrupted()) { // ... } } catch (InterruptedException consumed) /* Allow thread to exit */ } } public void cancel() { interrupt(); }
源代码改编自Java Concurrency in Practice.由于该cancel()
方法是公共的,您可以让另一个线程根据需要调用此方法.
一种方法是设置一个类变量并将其用作哨兵.
Class Outer { public static volatile flag = true; Outer() { new Test().start(); } class Test extends Thread { public void run() { while (Outer.flag) { //do stuff here } } } }
在上面的例子中设置一个外部类变量,即flag = true.将其设置为false以"杀死"该线程.
有一种方法可以做到这一点.但是如果你不得不使用它,要么你是一个糟糕的程序员,要么你正在使用由坏程序员编写的代码.所以,你应该考虑停止成为一个糟糕的程序员或停止使用这个糟糕的代码.此解决方案仅适用于没有其他方式的情况.
Thread f = Method m = Thread.class.getDeclaredMethod( "stop0" , new Class[]{Object.class} ); m.setAccessible( true ); m.invoke( f , new ThreadDeath() );
我想根据已经积累的评论添加几个观察结果.
如果安全管理器允许,Thread.stop()将停止一个线程.
Thread.stop()很危险.话虽如此,如果您在JEE环境中工作并且您无法控制所调用的代码,则可能是必要的.
您永远不应该停止停止容器工作线程.如果你想运行倾向于挂起的代码,(小心)启动一个新的守护程序线程并对其进行监视,必要时进行查杀.
stop()在调用线程上创建一个新的ThreadDeath错误,然后将该错误应用于目标线程.因此,堆栈跟踪通常毫无价值.
在JRE 6中,stop()检查安全管理器,然后调用调用stop0()的stop1().stop0()是本机代码.
我投票支持Thread.stop()
.
例如,您有一个持久的操作(如网络请求).据说您正在等待响应,但可能需要一些时间并且用户导航到其他UI.这个等待的线程现在是a)无用的b)潜在的问题,因为当他得到结果时,它完全没用,并且他将触发可能导致错误数量的回调.
所有这一切,他可以进行可能CPU密集的响应处理.作为开发人员,你甚至无法阻止它,因为你不能if (Thread.currentThread().isInterrupted())
在所有代码中抛出线条.
所以无法强行停止一个奇怪的线程.
问题相当模糊.如果你的意思是"如何编写一个程序,以便在我想要的时候线程停止运行",那么其他各种响应应该会有所帮助.但是,如果你的意思是"我有一个服务器的紧急情况,我现在无法重启,我只需要一个特定的线程就可以死",那么你需要一个干预工具来匹配监控工具jstack
.
为此我创建了jkillthread.请参阅其使用说明.