通过Id获取一个主题

时间:2013-08-14 06:01:13

标签: java jmx

我在JMX java中工作,我使用接口getAllThreadIds ()的{​​{1}}方法获取所有线程ID,但我需要一种方法来终止给定ID的线程。 例如:

ThreadMXBean

请帮助我 感谢

4 个答案:

答案 0 :(得分:9)

你可以试试这个:

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 rootGroup = thread.getThreadGroup();
    while (true) {
        ThreadGroup parentGroup = rootGroup.getParent();
        if (parentGroup == null) {
            break;
        }
        rootGroup = parentGroup;
    }
    return rootGroup;
}

但你应该打断Thread而不是stop

不推荐使用Thread.stop()方法,因为它会立即杀死Thread。因此,此Thread当前更改的数据结构可能仍处于不一致状态。中断使线程有机会正常关闭。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

您可以使用此方法:

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

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

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

答案 3 :(得分:2)

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