如何杀死Java中的java.lang.Thread ?

#1楼

在Java中,不会杀死线程,但是以协作方式完成线程的停止。 要求线程终止,然后线程可以正常关闭。

通常使用一个volatile boolean字段,线程将其设置为相应的值时会定期检查并终止。

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

#2楼

问题相当模糊。 如果您的意思是“我该如何编写程序以使线程在需要时停止运行”,那么各种其他响应都应该有所帮助。 但是,如果您的意思是“我的服务器出现紧急情况,我现在无法立即重启,而我只需要一个特定的线程就死了,可能会发生什么”,那么您需要一个干预工具来匹配jstack类的监控工具。

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

#3楼

有一种方法可以做到。 但是,如果您必须使用它,则说明您是一个不好的程序员,或者您正在使用一个由不好的程序员编写的代码。 因此,您应该考虑停止成为一个不良的程序员或停止使用此不良代码。 此解决方案仅适用于别无选择的情况。

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

#4楼

没有办法优雅地杀死线程。

您可以尝试中断线程,一种常见策略是使用毒药向线程发送消息以使其自行停止

public class CancelSupport {
public static class CommandExecutor implements Runnable {
private BlockingQueue queue;
public static final String POISON_PILL = “stopnow”;
public CommandExecutor(BlockingQueue queue) {
this.queue=queue;
}
@Override
public void run() {
boolean stop=false;
while(!stop) {
try {
String command=queue.take();
if(POISON_PILL.equals(command)) {
stop=true;
} else {
// do command
System.out.println(command);
}
} catch (InterruptedException e) {
stop=true;
}
}
System.out.println(“Stopping execution”);
}
}
}
BlockingQueue queue=new LinkedBlockingQueue();
Thread t=new Thread(new CommandExecutor(queue));
queue.put(“hello”);
queue.put(“world”);
t.start();
Thread.sleep(1000);
queue.put(“stopnow”);

#5楼

突然终止线程的尝试是众所周知的不良编程实践,也是不良应用程序设计的证据。 多线程应用程序中的所有线程都显式和隐式共享同一进程状态,并被迫相互协作以使其保持一致,否则,您的应用程序将容易出现难以诊断的错误。 因此,开发人员有责任通过仔细而清晰的应用程序设计保证这种一致性。

对于受控线程终止,有两种主要的正确解决方案:

使用共享易失性标志

使用Thread.interrupt()和Thread.interrupted()方法对。

可以在以下位置找到有关突然线程终止的问题的详尽详尽说明,以及受控线程终止的错误和正确解决方案的示例: