【问题标题】:Java - How to check value of 'ThreadLocal' variables in Eclipse?Java - 如何在 Eclipse 中检查“ThreadLocal”变量的值?
【发布时间】:2011-05-13 21:40:02
【问题描述】:

我的网络应用程序中填充了几个ThreadLocals。而且,在远程调试 webapp 时,我想在Eclipse 中查看这些ThreadLocal 变量的值(就像Eclipse 在调试透视图中的变量选项卡中显示其他变量的方式一样)。

知道如何在Eclipse 中调试期间查看ThreadLocal 变量的值吗?

谢谢!

【问题讨论】:

    标签: java eclipse debugging thread-local


    【解决方案1】:

    如果您想了解更多详细信息,即想查看所有线程的线程局部变量,以下代码可能会有所帮助:

        public static String printThreadLocal() {
            StringBuilder sb = new StringBuilder();
            try {
                Thread[] tarray = new Thread[Thread.activeCount()];
                Thread.enumerate(tarray);
                for (int i = 0; i < tarray.length; i++) {
                    Field threadLocalField = Thread.class.getDeclaredField("threadLocals");
                    threadLocalField.setAccessible(true);
                    Object o1 = threadLocalField.get(tarray[i]); //Thread.currentThread());
                    Field tableField = o1.getClass().getDeclaredField("table");
                    tableField.setAccessible(true);
                    Object[] o2 = (Object[]) tableField.get(o1);
                    for (Object temp : o2) {
                        if (temp != null) {
                            Field valueField = temp.getClass().getDeclaredField("value");
                            valueField.setAccessible(true);
                            Object o3 = valueField.get(temp);
                            sb.append(o3.toString() + "\n");
                        }
                    }
                }
    
            } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
    
            return sb.toString();
        }
    

    您可以将MyClass.printThreadLocal() 添加到Expressions

    【讨论】:

      【解决方案2】:

      当您遇到任何断点时,只需使用视图Expressions 显示Thread.currentThread() 的值,您将能够检查每个 ThreadLocal 值。

      【讨论】:

        【解决方案3】:

        在您的代码中,您必须将值放入您可以看到的局部变量中。您应该能够在使用 ThreadLocal 的位置下断点。

        问题在于调试器的连接与您感兴趣的连接在不同的线程上。Eclipse 可能对此有解决方案,但我不知道它是什么。

        【讨论】:

        • @peakit 我不明白。即使我需要调试线程局部变量。我还尝试使用 VisualVM 查看这些线程的利用率。我不知道如何在探查器选项卡中检查它们。你能解释一下吗?
        • @NagarajanShanmuganathan 你只能在 get() 值并将其放入局部变量时看到 ThreadLocal 的内容。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-06
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多