当前位置: 首页 > 面试题库 >

如何找到父线程的名称?

卓致远
2023-03-14
问题内容

我知道我们在谈论流程时可以有“父母”和“孩子”。但是可以得到父母的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[]调用之间传递时间戳。这将增加少量的数据开销,但是您将能够很好地了解分布式系统各个不同部分的性能。



 类似资料:
  • 问题内容: 如何编写此代码以备份父级2个级别以查找文件? 问题答案: 试试这个: 注意相对路径开始处的正斜杠。

  • 问题内容: 我有一个使用该框架的Java应用程序,并且我的代码看起来像这样 我的理解是,JVM会在内部创建5个线程的池。现在,当我在探查器中检查执行情况时,会得到类似的信息。 , 我需要一种方法来区分由我创建的和由服务器创建的 。 我在想,如果我可以命名线程池,它应该可以解决问题,但是看不到任何允许我执行此操作的API。 提前致谢。 问题答案: 您可以将自己的ThreadFactory传递给Sch

  • 问题内容: 给定一个类名作为字符串,如何在运行时获取它的包名?我没有带有包名+类名的完全限定名称。仅是类名。 我想在方法中使用包名。 找到第一个匹配的软件包名称(如果多个软件包具有相同的类),就可以了。 有任何想法吗? 更新 我没有要处理的Class实例。我的要求是使用该方法创建一个Class 。但是我只是将类名作为字符串。我需要某种方法来遍历软件包并确定我所拥有的类是否属于该软件包。 异常的堆栈

  • 问题内容: 我正在为我的ubuntu服务器(针对我的多客户端匿名聊天程序)实现一种简单的线程池机制,并且需要使我的工作线程进入睡眠状态,直到需要执行一项工作(以函数指针和参数的形式) 。 我当前的系统即将关闭。我(工人线程正在)问经理是否有工作可用,以及是否有5毫秒没有睡眠。如果存在,请将作业添加到工作队列中并运行该函数。糟糕的循环浪费。 什么我 喜欢 做的是做一个简单的事件性的系统。我正在考虑有

  • 问题内容: 目前,我正在更新我的x.509证书库以支持ECC。实现的大多数构建器都使用publicKey并从密钥派生算法等。在RSA中,这很简单,您可以检查密钥的算法,然后可以验证位长。但是,对于ECC,密钥是基于曲线的,曲线名称(当然)需要在证书中指定(作为OID)。 我现在正在研究的问题是找到一种方法来从java.security.interfaces.ECPublicKey或org.boun

  • 找到apk文件签名的最简单方法是什么?请注意,我不是在问代码。我只想从我的电脑上找到它。像这样的签名975yYkKAQF KST7g3ASHvHkYopq=