当前位置:  开发笔记 > 编程语言 > 正文

你如何杀死Java中的线程?

如何解决《你如何杀死Java中的线程?》经验,为你挑选了8个好方法。

你怎么java.lang.Thread在Java中杀了?



1> JaredPar..:

请参阅Sun关于他们弃用的原因Thread.stop().它详细说明了为什么这是一个糟糕的方法以及应该采取什么措施来安全地停止线程.

他们推荐的方法是使用共享变量作为标志,要求后台线程停止.然后,该变量可以由请求线程终止的不同对象设置.


如果你在PC上然后没问题,但如果你正在开发一个移动软件(我已经体验过它的android)那么你会得到OutOfMemoryError
可以/应该注意,为了确保通过标志快速通信停止请求,变量必须是易失性的(或者必须同步对变量的访问),如建议中所述.
此时此链接已被杀死.我能够在archive.org上找到它,但是:http://web.archive.org/web/20090202093154/http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation html的
我使用`java.sql.DriverManager`中的方法`getConnection()`.如果连接attemt花了太长时间我试着通过调用`Thread.interrupt()`来杀死相应的线程,但它根本不影响线程.然而,`Thread.stop()`可以工作,虽然oracle说如果`interrupt()`没有,它应该不起作用.我想知道如何使它工作并避免使用弃用的方法.

2> Fredrik..:

一般你不..

你要求它使用Thread.interrupt()(javadoc链接)中断它正在做的事情

这里有一个很好的解释为什么在javadoc (java技术说明链接)


@ABcDexter重点是中断不会中断任何事情,它只是向线程中的代码(或者线程调用的代码)发出信号,表明有人要求它中断它正在做的事情.然后该线程应该很好地停止处理并返回,就像它完成它应该做的那样(并且在那时,线程上下文可能也被丢弃).OTOH,如果你真的强行停止了线程,你的问题会非常好,答案也不明确.

3> Konrad Reich..:

在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()方法是公共的,您可以让另一个线程根据需要调用此方法.



4> karim79..:

一种方法是设置一个类变量并将其用作哨兵.

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以"杀死"该线程.


这不可靠; 使"flag"`volatile`确保它在任何地方都能正常工作.内部类不是静态的,因此该标志应该是一个实例变量.应该在访问器方法中清除该标志,以便可以执行其他操作(如中断).名称"flag"不具有描述性.
+1执行while(!Thread.currentThread().isInteruppted())是首选
我没有在run方法中获得"while"的东西.这是不是意味着在run方法中写入的内容将被重复?这不是我们想要线程首先要做的事情:(
正如一个侧面提示:一个变量作为标志只有在线程运行并且没有卡住时才起作用.Thread.interrupt()应该让线程脱离大多数等待条件(等待,睡眠,网络读取等).因此,您永远不应该永远不会捕获InterruptedException来使其工作.
这两种情况都会失败,例如你在while {// open ext process}中打开一个外部进程并且该进程被挂起,现在这个线程都不会被中断,也不会到达结束来检查你的布尔条件,而你是左挂...尝试使用例如使用java.exec启动一个python控制台并尝试获取控件而不写出口,看看是否有办法杀死该进程并退出....没有办法摆脱这种情况......

5> VadimPlatono..:

有一种方法可以做到这一点.但是如果你不得不使用它,要么你是一个糟糕的程序员,要么你正在使用由坏程序员编写的代码.所以,你应该考虑停止成为一个糟糕的程序员或停止使用这个糟糕的代码.此解决方案仅适用于没有其他方式的情况.

Thread f = 
Method m = Thread.class.getDeclaredMethod( "stop0" , new Class[]{Object.class} );
m.setAccessible( true );
m.invoke( f , new ThreadDeath() );


根本没有理由这样做,因为即使不赞成使用,仍然可以调用公共的“ Thread.stop”。

6> Steve11235..:

我想根据已经积累的评论添加几个观察结果.

    如果安全管理器允许,Thread.stop()将停止一个线程.

    Thread.stop()很危险.话虽如此,如果您在JEE环境中工作并且您无法控制所调用的代码,则可能是必要的.

    您永远不应该停止停止容器工作线程.如果你想运行倾向于挂起的代码,(小心)启动一个新的守护程序线程并对其进行监视,必要时进行查杀.

    stop()在调用线程上创建一个新的ThreadDeath错误,然后将该错误应用于目标线程.因此,堆栈跟踪通常毫无价值.

    在JRE 6中,stop()检查安全管理器,然后调用调用stop0()的stop1().stop0()是本机代码.



7> 小智..:

我投票支持Thread.stop().

例如,您有一个持久的操作(如网络请求).据说您正在等待响应,但可能需要一些时间并且用户导航到其他UI.这个等待的线程现在是a)无用的b)潜在的问题,因为当他得到结果时,它完全没用,并且他将触发可能导致错误数量的回调.

所有这一切,他可以进行可能CPU密集的响应处理.作为开发人员,你甚至无法阻止它,因为你不能if (Thread.currentThread().isInterrupted())在所有代码中抛出线条.

所以无法强行停止一个奇怪的线程.



8> Jesse Glick..:

问题相当模糊.如果你的意思是"如何编写一个程序,以便在我想要的时候线程停止运行",那么其他各种响应应该会有所帮助.但是,如果你的意思是"我有一个服务器的紧急情况,我现在无法重启,我只需要一个特定的线程就可以死",那么你需要一个干预工具来匹配监控工具jstack.

为此我创建了jkillthread.请参阅其使用说明.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有