[英]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 asThread (null, null, gname)
, wheregname
is a newly generated name.此构造函数与
Thread (null, null, gname)
具有相同的效果,其中gname
是新生成的名称。 Automatically generated names are of the form"Thread-"+n
, wheren
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.