我想在调用main方法时关闭所有正在运行的线程(如果有的话)。
public static void main(String[] args) throws Exception {
// Close all thread except current one
...
// Remaining of my program
}
答案 0 :(得分:8)
首先,你是否意识到JVM中有一些线程是自动启动的,你永远不应该搞乱它们?这些包括Finalizer
线程,各种JMX线程,Swing的EDT,Reference Handler
等。
其次,您是否意识到您不能只是在Java中安全地停止线程?你只能轻轻地问它停止。
如果 意识到上述情况,请尝试迭代JVM中的所有线程(请参阅:Get a List of all Threads currently running in Java)并在每个线程上调用interrupt()
,但不包括{{ 1}}线程。请不要使用main
,因为这可能会导致非常严重的问题,比如死锁。
答案 1 :(得分:1)
如果你的某些线程正在执行阻塞操作(即不对Thread#interrupt()做出反应),那么在操作完成之前就不可能关闭它们,除非杀死JVM。遗憾。
答案 2 :(得分:1)
你的问题的直接答案是在当前线程上调用getThreadGroup以获取当前线程所属的线程,然后枚举其他线程,然后在每个线程上调用interrupt。
真正的答案是你不应该出于Tomasz提供的答案中指出的原因这样做。
答案 3 :(得分:0)
这就是我解决问题的方法。 首先,我打断了本身可能中断的线程:
Thread.currentThread().interrupt();
在主类(或线程)中,我检测到我以前的线程不再存在,然后关闭最后一个生命线程:
Thread trx = new Thread(clTh);
Thread ttx = new Thread(csTh);
trx.start();
ttx.start();
while(trx.isAlive()) {
Thread.currentThread().sleep(1000);
}
while(ttx.isAlive()) {
ttx.interrupt();
Thread.currentThread().sleep(1000);
}
然后在我的第二个帖子中,等待in.readLine()
,handle it that way, testing in.ready()。