我可以获取当前线程生成的类和方法的名称吗?

Wil*_*lco 4 java multithreading

这是一个不寻常的问题:是否有可能获得最初产生当前运行线程的类/方法?运行堆栈跟踪将自然停在当前线程的调用堆栈顶部.

bes*_*sss 7

是的,您可以:我为您提供两种方式:一种标准,一种半黑客.

大多数答案都是过分的,而它应该是Java中的内置函数.

安装安全管理器并覆盖SecurityManager.getThreadGroup(),您可以轻松获得堆栈跟踪,也可以通过覆盖其余方法来禁用其余的安全检查.

Hacky one:在主线程中安装一个InheritableThreadLocal(名为main的那个并由方法main(String [] args)运行).覆盖受保护的InheritableThreadLocal.childValue(T parentValue),你就完成了.

注意:您将获得正在创建的线程的堆栈跟踪和父线程(引用),但这应该足以跟踪问题.

我决定编写超级简单的样本来说明它是多么容易:在这里你可以看到结果.看一下这个样本,我想这是我在这个网站上发布的最优雅的解决方案,主要是b/c它不明显但简单而聪明.

package bestsss.util;

import java.util.Arrays;

public class StackInterceptor extends InheritableThreadLocal<StackTraceElement[]>{
    public static final StackInterceptor instance;
    static{
        instance = new StackInterceptor();
        instance.set(new Throwable().getStackTrace());
    }

    @Override
    protected StackTraceElement[] childValue(StackTraceElement[] parentValue) {
        return new Throwable().getStackTrace();
    }

    //test//
    public static void main(String[] args) {
        Runnable r= new Runnable(){
            @Override
            public void run() {
                System.out.printf("%s - creation stack: %s%n", Thread.currentThread(), Arrays.toString(instance.get()).replace(',', '\n'));
            }           
        };

        Thread t1 = new Thread(r, "t1");
        //spacer
        Thread t2 = new Thread(r, "t2");
        t1.start();
        t2.start();     
    }
}
Run Code Online (Sandbox Code Playgroud)
Thread[t1,5,main] - creation stack: [bestsss.util.StackInterceptor.childValue(StackInterceptor.java:13)
 bestsss.util.StackInterceptor.childValue(StackInterceptor.java:1)
 java.lang.ThreadLocal$ThreadLocalMap.(ThreadLocal.java:334)
 java.lang.ThreadLocal$ThreadLocalMap.(ThreadLocal.java:242)
 java.lang.ThreadLocal.createInheritedMap(ThreadLocal.java:217)
 java.lang.Thread.init(Thread.java:362)
 java.lang.Thread.(Thread.java:488)
 bestsss.util.StackInterceptor.main(StackInterceptor.java:25)]
Thread[t2,5,main] - creation stack: [bestsss.util.StackInterceptor.childValue(StackInterceptor.java:13)
 bestsss.util.StackInterceptor.childValue(StackInterceptor.java:1)
 java.lang.ThreadLocal$ThreadLocalMap.(ThreadLocal.java:334)
 java.lang.ThreadLocal$ThreadLocalMap.(ThreadLocal.java:242)
 java.lang.ThreadLocal.createInheritedMap(ThreadLocal.java:217)
 java.lang.Thread.init(Thread.java:362)
 java.lang.Thread.(Thread.java:488)
 bestsss.util.StackInterceptor.main(StackInterceptor.java:27)]

祝你好运和快乐的黑客.