简体   繁体   English

了解 java 线程的名称

[英]Understanding the names of java Thread

I ran this code for my app我为我的应用程序运行了这段代码

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

I got the following results我得到以下结果

{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[GoogleApiHandler,5,main]=[Ljava.lang.StackTraceElement;@a4b3ec8, Thread[Thread-2,3,main]=[Ljava.lang.StackTraceElement;@5dadb61, Thread[HeapTaskDaemon,5,system]=[Ljava.lang.StackTraceElement;@7d7a51c, Thread[ReferenceQueueDaemon,5,system]=[Ljava.lang.StackTraceElement;@b0d2686, Thread[FinalizerDaemon,5,system]=[Ljava.lang.StackTraceElement;@7fa6b47, Thread[main,5,main]=[Ljava.lang.StackTraceElement;@2397f74}` {线程[pool-1-thread-1,5,main]=[Ljava.lang.StackTraceElement;@e21f0dc, 线程[queued-work-looper,5,main]=[Ljava.lang.StackTraceElement;@1fec5e5, 线程[FinalizerWatchdogDaemon,5,system]=[Ljava.lang.StackTraceElement;@de438ba, Thread[process reaper,10,system]=[Ljava.lang.StackTraceElement;@d51036b, Thread[GoogleApiHandler,5,main]=[Ljava. lang.StackTraceElement;@a4b3ec8, 线程[Thread-2,3,main]=[Ljava.lang.StackTraceElement;@5dadb61, 线程[HeapTaskDaemon,5,system]=[Ljava.lang.StackTraceElement;@7d7a51c, 线程[ReferenceQueueDaemon ,5,system]=[Ljava.lang.StackTraceElement;@b0d2686, 线程[FinalizerDaemon,5,system]=[Ljava.lang.StackTraceElement;@7fa6b47, 线程[main,5,main]=[Ljava.lang.StackTraceElement ;@2397f74}`

I think the text Thread[pool-1-thread-1,5,main] conveys very important information, but I am not quite sure what exactly it means.我认为文本Thread[pool-1-thread-1,5,main]传达了非常重要的信息,但我不太确定它究竟意味着什么。 Could anyone please explain what does it mean?谁能解释一下这是什么意思?

UPDATE: For another app, I got output {Thread[Thread-7,5,main] =.. so Thread-7 seems to indicate something different from pool-1-thread-1 , so I want to understand what the names of threads indicate?更新:对于另一个应用程序,我得到了 output {Thread[Thread-7,5,main] =..所以Thread-7似乎表示与pool-1-thread-1不同的东西,所以我想了解名称线程表明?

UPDATE更新

Thread names indicate whatever the person who wrote the code that created the thread decided.线程名称表示编写创建线程的代码的人所决定的任何内容。 There is no simple answer to that question.这个问题没有简单的答案。

However, some names seem self-explanatory, eg the names listed in the formatted output below.但是,有些名称似乎是不言自明的,例如下面格式化的 output 中列出的名称。 Names like:名称如:

  • main - The main thread main - 主线程
  • Finalizer - The thread responsible for executing finalize() methods. Finalizer - 负责执行finalize()方法的线程。
  • . . . . . .

Other names are documented.其他名称记录在案。 Eg the javadoc of new Thread() says:例如new Thread()的 javadoc 说:

Allocates a new Thread object.分配一个新Thread object。 This constructor has the same effect as Thread (null, null, gname) , where gname is a newly generated name.此构造函数与Thread (null, null, gname)具有相同的效果,其中gname是新生成的名称。 Automatically generated names are of the form "Thread-"+n , where n is an integer.自动生成的名称采用"Thread-"+n形式,其中n是 integer。

So Thread-7 would appear to be the thread created by the 8th call to new Thread(...) that didn't specify a name.因此Thread-7似乎是第 8 次调用未指定名称的new Thread(...)创建的线程。

A thread name like pool-1-thread-1 would then also be an auto-generate name, for Thread #1 in Thread Pool #1.对于 Thread Pool #1 中的 Thread #1,像pool-1-thread-1这样的线程名称也将是自动生成的名称。


To print the result of calling Thread.getAllStackTraces() in an easily readable format, use code like this:要以易于阅读的格式打印调用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);
}

Example Output (Java 8)示例 Output (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)

Example Output (Java 15)示例 Output (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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM