How to list all threads currently running in Java
- Details
- Written by Nam Ha Minh
- Last Updated on 12 August 2019   |   Print Email
static Map<Thread,StackTraceElement[]> getAllStackTraces()
This method returns a map with keys are the Thread objects, so we can get only the key set and iterate over its elements:Set<Thread> threads = Thread.getAllStackTraces().keySet(); for (Thread t : threads) { // do something with each thread }The following code snippet will list all threads that are currently running in the JVM along with their information like name, state, priority, and daemon status:
Set<Thread> threads = Thread.getAllStackTraces().keySet(); for (Thread t : threads) { String name = t.getName(); Thread.State state = t.getState(); int priority = t.getPriority(); String type = t.isDaemon() ? "Daemon" : "Normal"; System.out.printf("%-20s \t %s \t %d \t %s\n", name, state, priority, type); }If you put this code snippet in a console program, the output would be something like this:
Finalizer WAITING 8 Daemon Attach Listener RUNNABLE 5 Daemon Signal Dispatcher RUNNABLE 9 Daemon Reference Handler WAITING 10 Daemon main RUNNABLE 5 NormalYou see, besides the main thread which runs the main program, there are 4 other threads - which are core and default threads necessary to run the JVM. Let’s understand these threads a little bit more:
- Reference Handler: this thread puts objects that are no longer needed to a queue which will be processed by the Finalizer thread below.
- Finalizer: this thread performs finalizations for objects that are no longer needed to release system resources. It executes each finalize() method of the objects (if implemented).
- Attach Listener: this thread is responsible for dynamic attach when another process injects a thread inside the JVM to query certain details about how the JVM is running. For example, the JConsole program is a tool that attaches to another Java program for the purpose of profiling and monitoring.
- Signal Dispatcher: this thread handles native signals sent by operating system to the JVM.
Attach Listener RUNNABLE 5 Daemon main RUNNABLE 5 Normal AWT-EventQueue-0 RUNNABLE 6 Normal Finalizer WAITING 8 Daemon Signal Dispatcher RUNNABLE 9 Daemon Reference Handler WAITING 10 Daemon Java2D Disposer WAITING 10 Daemon AWT-Windows RUNNABLE 6 Daemon AWT-Shutdown WAITING 5 Normal
- Java2D Disposer: performs finalization on GUI objects that are no longer needed.
- AWT-Windows: handles native windows events.
- AWT-Shutdown: is responsible for terminating GUI programs.
- AWT-Event-Queue-0: handles GUI events.
http-nio-8080-ClientPoller-1 RUNNABLE 5 Daemon Finalizer WAITING 8 Daemon main RUNNABLE 5 Normal Reference Handler WAITING 10 Daemon http-nio-8080-ClientPoller-0 RUNNABLE 5 Daemon ajp-nio-8009-Acceptor-0 RUNNABLE 5 Daemon Signal Dispatcher RUNNABLE 9 Daemon http-nio-8080-exec-1 WAITING 5 Daemon http-nio-8080-Acceptor-0 RUNNABLE 5 Daemon http-nio-8080-exec-2 RUNNABLE 5 Daemon ajp-nio-8009-ClientPoller-0 RUNNABLE 5 Daemon ajp-nio-8009-ClientPoller-1 RUNNABLE 5 Daemon NioBlockingSelector.BlockPoller-1 RUNNABLE 5 Daemon GC Daemon TIMED_WAITING 2 Daemon NioBlockingSelector.BlockPoller-2 RUNNABLE 5 Daemon Attach Listener RUNNABLE 5 DaemonAs you can see, most of the additional threads are spawned by the server for handling HTTP requests/responses.
Related Java Thread Tutorials:
- How to use Threads in Java (create, start, pause, interrupt and join)
- Understanding Thread Group in Java
- Understanding Thread Priorities and Daemon Thread in Java
- Understanding Thread States (Thread Life Cycle) in Java
Other Java Concurrency Tutorials:
- Java Synchronization Tutorial
- Understanding Deadlock, Livelock and Starvation with Code Examples in Java
- Understanding Java Fork-Join Framework with Examples
- Understanding Java Thread Pool and Executors
Comments