【问题标题】:Get a thread by Id通过 Id 获取线程
【发布时间】:2013-08-14 06:01:12
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: java jmx


    【解决方案1】:

    你可以试试这个:

    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;
    }
    

    但你应该打断Thread而不是stop

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        你可以使用这个方法:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2014-02-01
            • 2013-03-13
            • 2021-03-25
            • 2014-09-29
            • 2012-07-27
            • 2010-12-13
            • 1970-01-01
            • 1970-01-01
            • 2014-06-27
            相关资源
            最近更新 更多