簡體   English   中英

了解 java 線程的名稱

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM