[英]Understanding the names of java Thread
我为我的应用程序运行了这段代码
Map<Thread, StackTraceElement[]> myMap = Thread.getAllStackTraces();
Log.d("threads", myMap.toString());
我得到以下结果
{线程[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}`
我认为文本Thread[pool-1-thread-1,5,main]
传达了非常重要的信息,但我不太确定它究竟意味着什么。 谁能解释一下这是什么意思?
更新:对于另一个应用程序,我得到了 output {Thread[Thread-7,5,main] =..
所以Thread-7
似乎表示与pool-1-thread-1
不同的东西,所以我想了解名称线程表明?
更新
线程名称表示编写创建线程的代码的人所决定的任何内容。 这个问题没有简单的答案。
但是,有些名称似乎是不言自明的,例如下面格式化的 output 中列出的名称。 名称如:
main
- 主线程Finalizer
- 负责执行finalize()
方法的线程。 其他名称记录在案。 例如new Thread()
的 javadoc 说:
分配一个新
Thread
object。 此构造函数与Thread (null, null, gname)
具有相同的效果,其中gname
是新生成的名称。 自动生成的名称采用"Thread-"+n
形式,其中n
是 integer。
因此Thread-7
似乎是第 8 次调用未指定名称的new Thread(...)
创建的线程。
对于 Thread Pool #1 中的 Thread #1,像pool-1-thread-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);
}
示例 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)
示例 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.