如何找到父线程的名称?

我知道我们在谈论流程时可以有“父母”和“孩子”。但是可以得到父母的Thread名字吗?

我做了研究,但只找到了.Net的答案

但是您可能会考虑:

  1. 使用来自父线程的线程ID前缀新线程的名称
  2. 在您想要产生的方法上创建一个构造函数,该方法需要父对象的线程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

回到顶部