如何找到父线程的名称?
我知道我们在谈论流程时可以有“父母”和“孩子”。但是可以得到父母的Thread
名字吗?
我做了研究,但只找到了.Net的答案
但是您可能会考虑:
- 使用来自父线程的线程ID前缀新线程的名称
- 在您想要产生的方法上创建一个构造函数,该方法需要父对象的线程ID
编辑:我尝试设置名称:
public class Main { public static void main(String[] args) {
Thread r = new ThreadA();
r.start();
}
}
public class ThreadA extends Thread {
public void run() {
Thread.currentThread().setName("Thread A");
System.out.println("Here " + Thread.currentThread().getName());
Thread r = new ThreadB();
r.setName(Thread.currentThread().getName());
r.start();
}
}
public class ThreadB extends Thread {
public void run() {
Thread.currentThread().setName("Thread B");
System.out.println("Here " + Thread.currentThread().getName());
Thread r = new ThreadC();
r.setName(Thread.currentThread().getName());
r.start();
}
}
public class ThreadC extends Thread {
public void run() {
Thread.currentThread().setName("Thread C");
System.out.println("Here " + Thread.currentThread().getName());
}
}
回答:
我知道我们在谈论流程时可以有“父母”和“孩子”。但是可以获取父线程名称吗?
线程没有对父线程的引用,因此您无法从特定线程获取父名称。在查看代码时,父线程用于获取守护程序状态,优先级和其他信息,但名称未存储在新Thread
对象中。
您提到需要拥有线程的名称,以便可以将那些“一起放入控制流中”的线程分组。我会调查ThreadGroup
。它们不经常使用,但是在这种情况下,您可能需要使用:
ThreadGroup threadGroup = new ThreadGroup("mythreadgroup");Thread thread = new Thread(threadGroup, new Runnable() {...});
...
// then you can do such methods as
threadGroup.enumerate(...);
使用线程组,您可以将多个线程绑定在一起。当然,您也可以自己通过集进行此操作。
您提到 真正的 问题是如何测量分布式系统的每个组件中的“花费的时间”,在本例中为RMI处理程序。
恐怕这里没有简单的答案。对于壁钟,您将不得不将System.currentTimeMillis()
每个RMI方法调用的开始与结束之间的时间进行比较。您还可以使用以下代码来测试线程使用的CPU时间。
ThreadInfo threadInfo = ManagementFactory.getThreadMXBean().getThreadCpuTime(thread.getId());
要获得“用户”时间,请使用getThreadUserTime(...)
。我不确定线程ID是否已被重用,因此您可能要做的就是将所有线程ID记录在集合中的RMI调用中,然后在监视线程中记下它们的CPU和用户时间。
我怀疑RMI线程具有特定的名称,因此您的监视线程可以在线程列表中找到执行此操作的线程,但是您将无法确定哪个线程正在处理哪个RMI请求。
最后,要考虑的一件事是在过程中的多个时间点获取时间戳,并在两次long[]
调用之间传递时间戳。这将增加少量的数据开销,但是您将能够很好地了解分布式系统各个不同部分的性能。
以上是 如何找到父线程的名称? 的全部内容, 来源链接: utcz.com/qa/400450.html