- Based on functionality we can group threads into a single unit which is nothing but thread group i.e Thread group contains a group of Threads.
- In addition to threads, thread group can also contain sub thread groups
- The main advantage of maintaining Thread in the form of Thread group is we can perform common operations very easily.
- Every thread in java belongs some group, main thread belongs to main group.
- Every thread group in java is a child group of system group either directly or indirectly. Hence system group acts as root for all thread groups in java.
- System group contains several system level threads like :
a. Finalizer (Garbage Collector)
b. Reference Handler
c. Signal Dispatcher
d. Attach Listener
e. Main Thread group
etc - ThreadGroup is a java class present in java.lang package and it is direct child class of object.
- Threads in the Thread Group that already have higher priority won’t be affected when a priority of their Thread Group changes(setMaxPriority()) but for newly added Threads this priority is applicable.

public class ThreadGroupDemo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getThreadGroup().getName());
System.out.println(Thread.currentThread().getThreadGroup().getParent().getName());
}
}
Output :

Constructors :
- ThreadGroup g = new ThreadGroup(String group);
Creates a new Thread group with the specified group name.
The parent of the new group is the thread group of currently executing thread.
Example : ThreadGroup g = new ThreadGroup(“First Group”); - ThreadGroup g = new ThreadGroup(ThreadGroup parentGroup,String groupName);
Creates a new Thread group with specified group name.
The parent of this new thread group is specified parent group.
Example : ThreadGroup g1 = new ThreadGroup(g,”Second Group”);
ThreadGroup g = new ThreadGroup(String group); ThreadGroup g = new ThreadGroup(ThreadGroup parentGroup,String groupName);
public class ThreadGroupDemo {
public static void main(String[] args) {
ThreadGroup g = new ThreadGroup("FirstGroup");
System.out.println(g.getParent().getName());
ThreadGroup g1 = new ThreadGroup(g,"SecondGroup");
System.out.println(g1.getParent().getName());
}
}
Output

system group --> main group --> First Group --> Second Group
Important Method of Thread Group Class :
Sting getName() int getMaxPriority() void setMaxPriority(int p) ThreadGroup getParent() void list() //print information about thread group int activeCount() //returns number of active threads present in the Thread group int activeCountGroup() //returns number of active group present in the current thread group int enumeration(Thread[] t) //to copy all active Threads(also sub threads) of this thread group into array int enumeration(ThreadGroup[] t) //To copy all active sub Thread Groups into thread group array boolean isDaemon() //To check if a the ThreadGroup is a Deamon group void setDaemon(boolean b) void interrupt() //To interrupt all waiting or sleeping thread present in the Thread Group void destroy() //To destroy ThreadGroup and its sub thread groups
- Threads in the Thread Group that already have higher priority won’t be affected when a priority of their Thread Group changes(setMaxPriority()) but for newly added Threads this priority is applicable.
public class ThreadGroupDemo2 {
public static void main(String[] args) {
ThreadGroup g1 = new ThreadGroup("Group 1");
Thread t1 = new Thread(g1,"Thread 1");
Thread t2 = new Thread(g1,"Thread 2");
g1.setMaxPriority(3);
Thread t3 = new Thread(g1,"Thread 3");
System.out.println(t1.getPriority());//5
System.out.println(t2.getPriority());//5
System.out.println(t3.getPriority());//3
}
}
2. activeCount() and activeGroupCount() and list()
package com.demo8;
public class ThreadGroupDemo3 {
public static void main(String[] args) throws InterruptedException {
ThreadGroup g1 = new ThreadGroup("Group 1");
ThreadGroup g2 = new ThreadGroup(g1,"Group 2");
MyThread t1 = new MyThread(g1,"Thread 1");
MyThread t2 = new MyThread(g1,"Thread 2");
t1.start();
t2.start();
System.out.println("Active Thread count : "+g1.activeCount());
System.out.println("Active Thread count : "+g1.activeGroupCount());
g1.list();
t1.join();
t2.join();
System.out.println("Active Thread count : "+g1.activeCount());
System.out.println("Active Thread count : "+g1.activeGroupCount());
g1.list();
}
}
class MyThread extends Thread{
MyThread(ThreadGroup groupName,String name){
super(groupName,name);
}
public void run() {
System.out.println("Child Thread");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Output :

Thread Group hierarchy of the above program : system group --> main group --> group 1 --> group 2
3. int enumeration(Thread[] t) and int enumeration(ThreadGroup[] t)
Write a program to display all active thread names belonging to system group and its child groups.
public class ThreadGroupDemo4 {
public static void main(String[] args) {
ThreadGroup systemGroup = Thread.currentThread().getThreadGroup().getParent();
Thread[] threadArray = new Thread[systemGroup.activeCount()];
systemGroup.enumerate(threadArray);
for(Thread t : threadArray) {
System.out.println("Thread Name : "+t.getName()+" -----------> Is Demon : "+t.isDaemon());
}
}
}
