gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:47:09 24 4
gpt4 key购买 nike

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

最佳答案

是的,您可以:我为您提供两种方式:一种是标准方式,一种是半破解方式。

虽然它应该是 Java 中的内置函数,但大多数答案都过分了。

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

Hacky 一个:在主线程中安装一个 InheritableThreadLocal(名为 main 并通过方法 main(String[] args) 运行的线程)。覆盖 protected InheritableThreadLocal.childValue(T parentValue) 就完成了。

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

我决定编写一个 super 简单的示例来说明它有多么简单:在这里你可以看到结果。查看示例,我想这是我在此站点上发布过的最优雅的解决方案,主要是因为它不明显但简单而智能。

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();
}
}
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)]

祝你好运,黑客愉快。

关于java - 我可以获取生成当前线程的类和方法的名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6364849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com