[英]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.