理解java线程的名称
我为我的应用程序运行了此代码理解java线程的名称,java,android,multithreading,android-studio,Java,Android,Multithreading,Android Studio,我为我的应用程序运行了此代码 Map<Thread, StackTraceElement[]> myMap = Thread.getAllStackTraces(); Log.d("threads", myMap.toString()); Map myMap=Thread.getAllStackTraces(); Log.d(“threads”,myMap.toString()); 我得到了以下结果 {Thread[pool-1-Thread-1,5,main
Map<Thread, StackTraceElement[]> myMap = Thread.getAllStackTraces();
Log.d("threads", myMap.toString());
Map myMap=Thread.getAllStackTraces();
Log.d(“threads”,myMap.toString());
我得到了以下结果
{Thread[pool-1-Thread-1,5,main]=[Ljava.lang.StackTraceeElement;@e21f0dc,Thread[queued work looper,5,main]=[Ljava.lang.StackTraceeElement;@1fec5e5,Thread[FinalizerWatchdogDaemon,5,system]=[Ljava.lang.StackTraceeElement;@de438ba,Thread[process reaper,10,system]=[Ljava.lang.StackTraceeElement;@d51036b,Thread[GooglePiHandler,5,main]=[Ljava.lang.StackTraceeElement;@a4b3ec8,线程[Thread-2,3,main]=[Ljava.lang.StackTraceeElement;@5dadb61,线程[HeapTaskDaemon,5,system]=[Ljava.lang.StackTraceeElement;@7d7a51c,线程[ReferenceQueueDaemon,5,system]=[Ljava.lang.StackTraceeElement;@b0d2686,线程[FinalizerDaemon,5,system]=[Ljava.lang.StackTraceeElement;@7fa6b47,线程[main,5,5,main]=[Ljava.lang.StackTraceeElement;@2397f74}`
我认为文本Thread[pool-1-Thread-1,5,main]
传达了非常重要的信息,但我不太清楚它的确切含义。有人能解释一下它的含义吗
更新:对于另一个应用程序,我得到了输出
{Thread[Thread-7,5,main]=..
,因此Thread-7
似乎表示与pool-1-Thread-1
不同的东西,所以我想了解线程的名称表示什么?UPDATE
线程名称表示创建线程的代码的编写者所决定的内容。这个问题没有简单的答案
但是,有些名称似乎是不言自明的,例如下面格式化输出中列出的名称。例如:
-主线程main
-负责执行Finalizer
方法的线程finalize()
线程
对象。此构造函数与线程(null,null,gname)
具有相同的效果,其中gname
是新生成的名称。自动生成的名称的形式为“Thread-”+n
,其中n
是一个整数
因此Thread-7
似乎是第8次调用new Thread(…)
创建的线程,它没有指定名称
像pool-1-thread-1
这样的线程名称也将是线程池#1中的线程#1的自动生成名称
要以易于阅读的格式打印调用结果,请使用以下代码:
Map myMap=Thread.getAllStackTraces();
for(条目:myMap.entrySet()){
System.out.println(entry.getKey());
对于(StackTraceElement元素:entry.getValue())
系统输出打印项次(“+elem”);
}
示例输出(Java8)
线程[终结器,8,系统]
java.lang.Object.wait(本机方法)
remove(ReferenceQueue.java:144)
remove(ReferenceQueue.java:165)
java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
线程[附加侦听器,5,系统]
线程[信号调度器,9,系统]
线程[参考处理程序,10,系统]
java.lang.Object.wait(本机方法)
wait(Object.java:502)
java.lang.ref.Reference.tryHandlePending(Reference.java:191)
java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
螺纹[main,5,main]
java.lang.Thread.dumpThreads(本机方法)
getAllStackTraces(Thread.java:1610)
main(Test8.java:7)
示例输出(Java15)
线程[终结器,8,系统]
JAVAbase@15.0.1/java.lang.Object.wait(本机方法)
JAVAbase@15.0.1/remove(ReferenceQueue.java:155)
JAVAbase@15.0.1/remove(ReferenceQueue.java:176)
JAVAbase@15.0.1/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:170)
线程[附加侦听器,5,系统]
线程[信号调度器,9,系统]
线程[通知线程,9,系统]
螺纹[普通清洁剂,8,无害螺纹组]
JAVAbase@15.0.1/java.lang.Object.wait(本机方法)
JAVAbase@15.0.1/remove(ReferenceQueue.java:155)
JAVAbase@15.0.1/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:148)
JAVAbase@15.0.1/run(Thread.java:832)
JAVAbase@15.0.1/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:134)
螺纹[main,5,main]
JAVAbase@15.0.1/java.lang.Thread.dumpThreads(本机方法)
JAVAbase@15.0.1/getAllStackTraces(Thread.java:1649)
app//Test.main(Test.java:9)
线程[参考处理程序,10,系统]
JAVAbase@15.0.1/java.lang.ref.Reference.waitForReferencePendingList(本机方法)
JAVAbase@15.0.1/processPendingReferences(Reference.java:241)
JAVAbase@15.0.1/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:213)
WellThread[pool-1-Thread-1,5,main]
是Thread.toString()的输出,如果您查看(并且源代码确认了这一点和提到的顺序),您将看到:name、priority和group name。在您的示例中,除“process reaper”之外的所有线程都具有优先级5,您基本上有两个组:“main”和“system”。@Thomas谢谢,这非常有帮助!所以第一个线程的名称是pool-1-thread-1
,但在我得到的不同应用程序上运行代码时,它也应该指示其他的东西{thread[thread-7,5,main]=[Ljava…
所以我知道名称是Thread-7
优先级是5,但它仍然表示与pool-1-Thread-1
不同。好的pool-1-Thread-1
基本上只是一个名称,你可以提供你想要的任何名称,例如新线程(“非常重要,但毫无意义的名称”)
。您从名称中获得的信息可能有意义,但不一定有意义。在您的特定情况下,我假设有