9

我在 JMX java 中工作,我通过使用getAllThreadIds ()接口的方法获取所有线程 ID,ThreadMXBean但我需要一种方法来杀死给定 ID 的线程。

例如:

ThreadMXBean tbean;
tbean = ManagementFactory.getThreadMXBean();
long[] IDs=tbean.getAllThreadIds();
//.... I need a way to kill the Threads which have this IDs
4

4 回答 4

10

你可以试试这个:

public void printAllThreadIds() {
    Thread currentThread = Thread.currentThread();
    ThreadGroup threadGroup = getRootThreadGroup(currentThread);
    int allActiveThreads = threadGroup.activeCount();
    Thread[] allThreads = new Thread[allActiveThreads];
    threadGroup.enumerate(allThreads);

    for (int i = 0; i < allThreads.length; i++) {
        Thread thread = allThreads[i];
        long id = thread.getId();
        System.out.println(id);
    }
}

private static ThreadGroup getRootThreadGroup(Thread thread) {
    ThreadGroup currentGroup = thread.getThreadGroup();

    ThreadGroup parentGroup;
    while ((parentGroup = currentGroup.getParent()) != null) {
        currentGroup = parentGroup;
    }

    return currentGroup;
}

但是你应该打断 aThread而不是stop它。

Thread.stop()方法已被弃用,因为它会立即杀死一个Thread. 因此,当前由此更改的数据结构Thread可能会保持不一致的状态。中断使线程有机会优雅地关闭。

于 2013-08-14T06:18:08.830 回答
2

在java中实际上没有杀死线程的好方法。曾经有一个名为 Thread.stop() 的 api,但它也已被弃用。检查此链接以获取更多详细信息,为什么 Thread.stop 不好以及我们应该如何停止线程。

http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

仅获取线程 ID 对您没有帮助,您需要让线程对象引用设置一个标志来停止该线程。

于 2013-08-14T06:08:45.953 回答
2

您可以使用此方法:

static Map<Thread,StackTraceElement[]>  getAllStackTraces()

获取所有线程,然后按键遍历map,找到合适的线程。

但这是一个非常糟糕的方法。你将如何停止线程?使用void stop()方法?我建议将 Executor 框架与中断机制结合使用。

于 2013-08-14T06:09:40.360 回答
2

Thread.getAllStackTraces返回所有活动线程的所有堆栈跟踪Map<Thread,StackTraceElement[]>.这些应该是 ThreadMXBean 返回的相同线程。您可以从此映射中提取线程并中断它们。请注意,Java 中没有合法的方法可以杀死线程。

于 2013-08-14T06:10:14.763 回答