关闭除主要线程以外的所有线程

时间:2012-02-29 07:41:47

标签: java multithreading

我想在调用main方法时关闭所有正在运行的线程(如果有的话)。

public static void main(String[] args) throws Exception {
  // Close all thread except current one
  ...
  // Remaining of my program
}

4 个答案:

答案 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()