Java ThreadGroup Example

0

A thread group represents a set of threads. A thread group not only includes threads but also other thread groups. Each child thread group in turn contains threads or more thread groups and knows the parent thread group it belongs to. Thus thread group structure is like a tree where except the top thread group all the other branches has a parent.
In this article, we will create a bunch of threads assigned to a thread group and start them. Each thread is responsible for a specific task. We will use thread group to identify the the number of active threads in this thread group. This is useful if we want to know which of the threads are still active and which is using most of the cpu time.

ThreadGroup Example

In the below example, we create a bunch of threads, start them. Each task takes it sown time of execution. We then print the active threads found in the group.

Few things to note about:

  1. First we create a thread group.
    ThreadGroup threadGroup = new ThreadGroup("MyThreadGroup");
    
  2. Create a thread array. Assign the thread to a group during its creation. We also pass a task that thread will execute.
    Thread[] threads = new Thread[30];
    for (int i = 0; i < threads.length; i++) {
        String taskName = "Task-" + i;
        threads[i]= new Thread(threadGroup, new MyTask(taskName, i * 40), "Thread for (" + taskName + ")");
        threads[i].setDaemon(true);
        threads[i].start();
    }
    
  3. We print the active threads in the group.
    for (Thread thread : getThreadsInGroup(threadGroup)) {
        System.out.println("In group(" + thread + ")");
    }
    
  4. ThreadGroup.activeCount() – returns an estimated number of active threads
  5. Next, we get the active threads.
    Thread[] threads = new Thread[activeThreadCount];
    int enumCount = group.enumerate(threads);
    
  6. If the active thread count is more than the allocated thread array size, we will create a larger size of thread array and fetch the active threads again.

ThreadGroupExample:

package com.javarticles.threads;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ThreadGroupExample {
    public static void main(String[] args) {
        ThreadGroup threadGroup = new ThreadGroup("MyThreadGroup");
        Thread[] threads = new Thread[30];
        for (int i = 0; i < threads.length; i++) {
            String taskName = "Task-" + i;
            threads[i]= new Thread(threadGroup, new MyTask(taskName, i * 40),
                    "Thread for (" + taskName + ")");
            threads[i].setDaemon(true);
            threads[i].start();
        }
        System.out.println("Threads contained in the group");
        for (Thread thread : getThreadsInGroup(threadGroup)) {
            System.out.println("In group(" + thread + ")");
        }
        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }  
        System.out.println("All threads finished their tasks");
    }
    
    private static List getThreadsInGroup(ThreadGroup group) {
        int activeThreadCount = group.activeCount();
        for (int loopCount = 0; loopCount < 2; loopCount++) {
            System.out.println("Try one more loop");
            Thread[] threads = new Thread[activeThreadCount];
            int enumCount = group.enumerate(threads);
            if (enumCount < activeThreadCount) {
                System.out.println("enumCount(" + enumCount + ")" + 
                        "< threadArraySize(" + activeThreadCount + ")"); return Arrays.asList(threads).subList(0, enumCount); } System.out.println("enumCount(" + enumCount + ")" + "> threadArraySize(" + activeThreadCount + ")");
            activeThreadCount += 2;
        }
        return Collections.emptyList();
    }
}

Output:

Start MyTask (Task-1)
Start MyTask (Task-4)
Start MyTask (Task-0)
Task-0 done
Task-4 done
Start MyTask (Task-2)
Start MyTask (Task-3)
Start MyTask (Task-8)
Task-8 done
Task-3 done
Start MyTask (Task-12)
Task-12 done
Start MyTask (Task-13)
Start MyTask (Task-10)
Task-10 done
Start MyTask (Task-16)
Start MyTask (Task-11)
Start MyTask (Task-21)
Start MyTask (Task-9)
Task-9 done
Start MyTask (Task-5)
Task-5 done
Task-21 done
Threads contained in the group
Try one more loop
Start MyTask (Task-24)
enumCount(21)> threadArraySize(21)
Start MyTask (Task-25)
Start MyTask (Task-6)
Start MyTask (Task-26)
Task-1 done
Start MyTask (Task-28)
Start MyTask (Task-7)
Task-6 done
Start MyTask (Task-29)
Task-26 done
Task-25 done
Start MyTask (Task-23)
Task-23 done
Task-24 done
Start MyTask (Task-20)
Try one more loop
Start MyTask (Task-15)
Task-15 done
Task-11 done
Start MyTask (Task-18)
Task-16 done
Start MyTask (Task-19)
Task-19 done
Start MyTask (Task-27)
Task-27 done
Start MyTask (Task-17)
Task-13 done
Start MyTask (Task-14)
Task-2 done
Task-14 done
Task-17 done
Task-18 done
Start MyTask (Task-22)
Task-20 done
enumCount(15)< threadArraySize(23)
Task-29 done
Task-7 done
Task-28 done
Task-22 done
In group(Thread[Thread for (Task-2),5,])
In group(Thread[Thread for (Task-7),5,])
In group(Thread[Thread for (Task-11),5,])
In group(Thread[Thread for (Task-13),5,])
In group(Thread[Thread for (Task-14),5,])
In group(Thread[Thread for (Task-15),5,])
In group(Thread[Thread for (Task-16),5,])
In group(Thread[Thread for (Task-17),5,])
In group(Thread[Thread for (Task-18),5,])
In group(Thread[Thread for (Task-19),5,])
In group(Thread[Thread for (Task-20),5,])
In group(Thread[Thread for (Task-22),5,])
In group(Thread[Thread for (Task-27),5,])
In group(Thread[Thread for (Task-28),5,])
In group(Thread[Thread for (Task-29),5,])
All threads finished their tasks

Download the source code

This was an example about thread groups. We show you how to find the still active threads belonging to thread group.

You can download the source code here: javaThreadGroupExample.zip

About Author

Ram's expertise lies in test driven development and re-factoring. He is passionate about open source technologies and loves blogging on various java and open-source technologies like spring. You can reach him at rsatish.m@gmail.com

Comments are closed.