Java 我能确定一个给定的线程是由这个线程还是由这个线程的后代启动的吗?
上下文:我想向根日志记录器添加一个日志Java 我能确定一个给定的线程是由这个线程还是由这个线程的后代启动的吗?,java,multithreading,logging,Java,Multithreading,Logging,上下文:我想向根日志记录器添加一个日志处理程序,以收集任务的所有日志输出。在任务执行期间,可能会创建其他线程。我也想要他们的日志输出 其中一些线程是由库的方法创建的,例如Ant 当前,我的日志处理程序检查发布方法中的当前线程,并存储与原始任务线程相同的记录。但是我错过了任务线程生成的线程的日志消息 仅按开始/停止时间运行也不起作用,因为多个任务同时运行,每个任务都有自己的潜在子线程。每个线程实例中都有一个线程。线程组形成一个树,其中除初始线程组外的每个线程组都有一个父线程组。使用此信息,我们可以
处理程序,以收集任务的所有日志输出。在任务执行期间,可能会创建其他线程。我也想要他们的日志输出
其中一些线程是由库的方法创建的,例如Ant
当前,我的日志处理程序检查发布
方法中的当前线程
,并存储与原始任务线程相同的记录。但是我错过了任务线程生成的线程的日志消息
仅按开始/停止时间运行也不起作用,因为多个任务同时运行,每个任务都有自己的潜在子线程。每个线程实例中都有一个线程。线程组形成一个树,其中除初始线程组外的每个线程组都有一个父线程组。使用此信息,我们可以应用该方法检查当前线程是否是给定线程的父线程:
// 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将显示每个正在运行的线程。比如说。程序中的每个线程在树中显示为一个节点:
如果您想更进一步,做一些肮脏的工作,您可以使用反射来访问存储在给定线程组中的线程,但我劝您不要采取这样的措施:
// 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...
*/
如果您的构建路径上碰巧有线程,您也可以玩一玩。您可以扩展线程
类,并且在构造函数中需要父线程,然后使用getter。不幸的是,我无法控制在使用的库中创建线程。是吗?我必须检查eclipse是否也能做到这一点。如果您控制了初始线程,您可以在新的ThreadGroup
中创建它,因为默认情况下,大多数线程都是在与其“父”线程相同的组中创建的,然后使用ThreadGroup
作为日志过滤器。但是,如果库在特定的线程组中创建线程,这将不起作用;如果库使用线程池,这将不起作用,因此您可能会运气不佳。@CardinalSystem看起来像是我的eclipse在调试器中只显示了一个简单的线程列表。谢谢,听起来很棒。我现在正在实现和测试这个。另外,您使用哪个IDE来显示线程层次结构?看起来它正在工作:)。我现在还在为备份任务设置自定义线程组。再次感谢。@RetoHöhener我直到现在(2年后)才看到你的第二条评论。幸福的事情正在为你解决。如果你有兴趣多学一点,可以看看。