Reputation: 2508
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}`
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. 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?
Upvotes: 0
Views: 766
Reputation: 159155
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, e.g. the names listed in the formatted output below. Names like:
main
- The main threadFinalizer
- The thread responsible for executing finalize()
methods.Other names are documented. E.g. the javadoc of new Thread()
says:
Allocates a new
Thread
object. This constructor has the same effect asThread (null, null, gname)
, wheregname
is a newly generated name. Automatically generated names are of the form"Thread-"+n
, wheren
is an integer.
So Thread-7
would appear to be the thread created by the 8th call to new Thread(...)
that didn't specify a name.
A thread name like pool-1-thread-1
would then also be an auto-generate name, for Thread #1 in Thread Pool #1.
To print the result of calling Thread.getAllStackTraces()
in an easily readable format, use code like this:
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)
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)
Thread[Finalizer,8,system]
[email protected]/java.lang.Object.wait(Native Method)
[email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
[email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)
[email protected]/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]
[email protected]/java.lang.Object.wait(Native Method)
[email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
[email protected]/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:148)
[email protected]/java.lang.Thread.run(Thread.java:832)
[email protected]/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:134)
Thread[main,5,main]
[email protected]/java.lang.Thread.dumpThreads(Native Method)
[email protected]/java.lang.Thread.getAllStackTraces(Thread.java:1649)
app//Test.main(Test.java:9)
Thread[Reference Handler,10,system]
[email protected]/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
[email protected]/java.lang.ref.Reference.processPendingReferences(Reference.java:241)
[email protected]/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:213)
Upvotes: 1