gpt4 book ai didi

java - 我能否确定给定线程是否已由该线程或该线程的后代启动?

转载 作者:行者123 更新时间:2023-11-30 06:21:43 26 4
gpt4 key购买 nike

上下文:我想向根记录器添加一个日志Handler,以便收集任务的所有日志输出。在任务执行期间,可能会创建其他线程。我也想要他们的日志输出。

其中一些线程是通过库的方法创建的,例如 Ant。

目前,我的日志处理程序在 publish 方法中检查当前的Thread,如果它与原始任务线程相同,则存储记录。但我错过了任务线程生成的线程的日志消息。

仅按开始/停止时间也是行不通的,因为多个任务同时运行,每个任务都有自己的潜在子线程。

最佳答案

每个线程实例都有一个ThreadGroup在其中。线程组形成一棵树,其中除了初始线程组之外的每个线程组都有一个父线程组。使用此信息,我们可以应用 ThreadGroup#parentOf(ThreadGroup)检查当前线程是否是给定线程的父级的方法:

// potentialParent would probably just be Thread.currentThread();
public static boolean isChild(Thread potentialChild, Thread potentialParent) {
try {
return potentialParent.getThreadGroup().parentOf(potentialChild.getThreadGroup());
}catch(NullPointerException e) {
e.printStackTrace();
}
return false;
}

如果您使用调试器,某些 IDE 将显示每个正在运行的线程。拿Eclipse's Debug View例如。程序中的每个线程都显示为树中的一个节点:

Debug View

如果你想更进一步,做一些肮脏的工作,你可以使用反射来访问存储在给定线程组中的线程,但我不建议你采取这样的措施:

// There is a thread array field in the ThreadGroup class.
Field f = ThreadGroup.class.getDeclaredField("threads");
// The 'threads' field has no access modifiers.
f.setAccessible(true);

Thread[] threads = (Thread[]) f.get(Thread.currentThread().getThreadGroup());
/*
* Search 'threads' accordingly...
*/

您还可以尝试一下 ThreadUtils.getAllThreadGroups()如果您碰巧有Appache commons lang在您的构建路径上。

关于java - 我能否确定给定线程是否已由该线程或该线程的后代启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48013521/

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