当前位置: 首页 > 知识库问答 >
问题:

了解Java线程的名称

年嘉禧
2023-03-14

我为我的应用程序运行了这段代码

Map<Thread, StackTraceElement[]> myMap = Thread.getAllStackTraces();
Log.d("threads", myMap.toString());

我得到了以下结果

{Thread[pool-1-thread-1,5,main]=[Ljava.lang.StackTraceElement;@E21F0DC,Thread[queued-work-looper,5,main]=[Ljava.lang.StackTraceElement;@1FEC5E5,Thread[FinalizerWatchdogDaemon,5,System]=[Ljava.lang.StackTraceElement;@DE438BA,Thread[process reaper,10,System]=[Ljava.lang.StackTraceElement;@D51036B,Thread

我认为文本thread[pool-1-thread-1,5,main]传达了非常重要的信息,但我不太确定它到底是什么意思。谁能解释一下这是什么意思吗?

更新:对于另一个应用程序,我得到了output{thread[Thread-7,5,main]=..所以Thread-7似乎表示与pool-1-thread-1不同的东西,所以我想知道线程的名称表示什么?

共有1个答案

羊和光
2023-03-14

更新

线程名称表示编写创建线程的代码的人所决定的任何内容。这个问题没有简单的答案。

然而,有些名称似乎是不言而喻的,例如下面格式化输出中列出的名称。名称如:

  • main-主线程
  • finalizer-负责执行finalize()方法的线程。
  • 。..

其他名字都有记录。例如。new Thread()的javadoc表示:

分配新的thread对象。此构造函数与线程(null,null,gname)具有相同的效果,其中gname是新生成的名称。自动生成的名称的形式为“thread-”+n,其中n是一个整数。

因此thread-7似乎是第8次调用未指定名称的new thread(...)所创建的线程。

pool-1-thread-1这样的线程名称也将是线程池#1中线程#1的自动生成名称。

若要以易于阅读的格式打印调用Thread.GetAllStackTraces()的结果,请使用如下代码:

Map<Thread, StackTraceElement[]> myMap = Thread.getAllStackTraces();
for (Entry<Thread, StackTraceElement[]> entry : myMap.entrySet()) {
    System.out.println(entry.getKey());
    for (StackTraceElement elem : entry.getValue())
        System.out.println("    " + elem);
}

输出示例(Java 8)

Thread[Finalizer,8,system]
    java.lang.Object.wait(Native Method)
    java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
    java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
    java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
Thread[Attach Listener,5,system]
Thread[Signal Dispatcher,9,system]
Thread[Reference Handler,10,system]
    java.lang.Object.wait(Native Method)
    java.lang.Object.wait(Object.java:502)
    java.lang.ref.Reference.tryHandlePending(Reference.java:191)
    java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
Thread[main,5,main]
    java.lang.Thread.dumpThreads(Native Method)
    java.lang.Thread.getAllStackTraces(Thread.java:1610)
    Test8.main(Test8.java:7)

输出示例(Java 15)

Thread[Finalizer,8,system]
    java.base@15.0.1/java.lang.Object.wait(Native Method)
    java.base@15.0.1/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
    java.base@15.0.1/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)
    java.base@15.0.1/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:170)
Thread[Attach Listener,5,system]
Thread[Signal Dispatcher,9,system]
Thread[Notification Thread,9,system]
Thread[Common-Cleaner,8,InnocuousThreadGroup]
    java.base@15.0.1/java.lang.Object.wait(Native Method)
    java.base@15.0.1/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
    java.base@15.0.1/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:148)
    java.base@15.0.1/java.lang.Thread.run(Thread.java:832)
    java.base@15.0.1/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:134)
Thread[main,5,main]
    java.base@15.0.1/java.lang.Thread.dumpThreads(Native Method)
    java.base@15.0.1/java.lang.Thread.getAllStackTraces(Thread.java:1649)
    app//Test.main(Test.java:9)
Thread[Reference Handler,10,system]
    java.base@15.0.1/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
    java.base@15.0.1/java.lang.ref.Reference.processPendingReferences(Reference.java:241)
    java.base@15.0.1/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:213)
 类似资料:
  • 问题内容: 我知道jvm本身就是将Java可执行文件的字节码转换为本地机器代码的应用程序,但是当使用本地线程时,我有一些我似乎无法回答的问题。 是否每个线程都会创建自己的jvm实例来处理其特定执行? 如果不是,那么jvm是否必须有某种方式来调度它接下来将处理的线程,如果是的话,由于一次只能运行一个线程,这是否会使java的多线程性质变得没有用? 问题答案: 是否每个线程都创建自己的JVM实例以处理

  • 主要内容:1 如何获取线程名称,2 获取线程名称的例子1 如何获取线程名称 Thread类提供了更改和获取线程名称的方法。默认情况下,每个线程都有一个名称,即thread-0,thread-1等。通过使用setName()方法,我们可以更改线程的名称。setName()和getName()方法的语法如下: public String getName():用于返回线程的名称。 public void setName(String name):用于更改线

  • 问题内容: 假设我有一个利用该框架的应用程序 当我在调试器中运行此应用程序时,将使用以下(默认)名称创建一个线程:。如你所见,这并不是非常有用,而且据我所知,该框架没有提供一种简便的方法来命名已创建的线程或线程池。 那么,如何为线程/线程池提供名称呢?例如,。 问题答案: 你可以提供一个到。工厂将负责创建线程,并将能够为其命名。 引用Javadoc: 创建新线程 使用创建新线程。如果没有另外指定,

  • 考虑以下内核: 多线程单块: 现在1将从单个块启动请求的线程数,但最大线程数限制为1024(我的硬件)。只需生成另一个块。 2从多个块中启动请求数量的线程。现在,可以启动的最大线程数增加到了65535 * 1024。 3是块步幅循环,4是网格步幅循环。 我不明白的是3和4是如何迭代的?我读过的几篇文章中,状态网格步幅循环在批中迭代,这意味着什么? 调用时从3输出,作为内核执行 有时切换发生在0,1

  • 我使用Datadog与elasticsearch的集成来监控ES集群,它在仪表板上显示的一个重要指标是活动和等待搜索线程的数量。参考这个ES文档,我知道搜索线程在ES中的一个请求队列上工作,该队列的固定大小为1000。 如图所示,我看到很多等待线程,但这里没有解释拒绝队列异常。所以这意味着ES没有拒绝请求,但搜索线程仍然无法足够快地执行请求,因此最终处于等待状态很长一段时间。 问题 搜索请求队列的

  • 本文向大家介绍Java线程三种命名方法详解,包括了Java线程三种命名方法详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java线程三种命名方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.实例化一个线程对象 2.实例化一个线程对象的同时,通过构造方法对线程进行命名 3.使用自定义的线程类,在实例化线程对象的同时,进行