스레드 그룹
- 관련된 스레드를 묶어 관리할 목적으로 이용
- 스레드 그룹은 계층적으로 하위 스레드 그룹을 가질 수 있다.
- 자동 생성 스레드 그룹
- system 그룹 - JVM 운영에 필요한 스레드들을 포함
- system/main 그룹 - main thread를 포함함
- 스레드는 반드시 하나의 스레드 그룹에 포함된다.
- 기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 된다.
- 명시적으로 스레드 그룹에 포함시키지 않으면 기본적으로 system/main 그룹에 속한다.
스레드 그룹 이름 얻기
ThreadGroup group = Thread.currentThread.getThreadGroup(); String groupName = group.getName();
스레드 그룹 이름 예제
public class ThreadInfoEx { public static void main(String[] args) { AutoSaveThread autoSaveThread = new AutoSaveThread(); autoSaveThread.setName("AutoSaveThread"); autoSaveThread.setDaemon(true); autoSaveThread.start(); Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces(); Set<Thread> threads = map.keySet(); threads.forEach( t -> { System.out.println("name : " + t.getName() + ((t.isDaemon())?" 데몬 스레드":" 주 스레드")); System.out.println("\t"+"소속 그룹 : "+ t.getThreadGroup().getName()); System.out.println(); } ); } }
name : Attach Listener 데몬 스레드 소속 그룹 : system name : Finalizer 데몬 스레드 소속 그룹 : system name : Signal Dispatcher 데몬 스레드 소속 그룹 : system name : AutoSaveThread 데몬 스레드 소속 그룹 : main name : Common-Cleaner 데몬 스레드 소속 그룹 : InnocuousThreadGroup name : main 주 스레드 소속 그룹 : main name : Reference Handler 데몬 스레드 소속 그룹 : system name : Monitor Ctrl-Break 데몬 스레드 소속 그룹 : main Process finished with exit code 0
스레드 그룹 생성
ThreadGroup tg = new ThreadGroup(String name); ThreadGroup tg = new ThreadGroup(ThreadGroup parent, String name);
- 부모(parent) 그룹을 지정하지 않으면 현재 스레드가 속한 그룹의 하위 그룹으로 생성
- 스레드를 그룹에 명시적으로 포함시키는 방법
Thread t = new Thread(ThreadGroup group, Runnable target); Thread t = new Thread(ThreadGroup group, Runnable target, String name); Thread t = new Thread(ThreadGroup group, Runnable target, String name, long stackSize); Thread t = new Thread(ThreadGroup group, String name);
스레드 그룹의 일괄 interrupt( )
- 스레드 그룹의 interrupt( ) 를 호출하면 소속된 모든 스레드의 interrupt( ) 가 호출된다.

스레드 그룹메소드 예제
public class ThreadGroupInfoEx { public static void main(String[] args) throws InterruptedException { ThreadGroup myThreadGroup = new ThreadGroup("myThreadGroup"); WorkThread workThreadA = new WorkThread(myThreadGroup, "workThreadA"); WorkThread workThreadB = new WorkThread(myThreadGroup, "workThreadB"); workThreadA.start(); workThreadB.start(); ThreadGroup mainGroup = Thread.currentThread().getThreadGroup(); System.out.println("[main 스레드 그룹의 list() 메소드 호출]"); mainGroup.list(); Thread.sleep(3000); myThreadGroup.interrupt(); System.out.println("main terminated"); } static class WorkThread extends Thread{ public WorkThread(ThreadGroup group, String name) { super(group, name); } @Override public void run() { while(true){ try { Thread.sleep(1000); System.out.println(getName()+" running"); } catch (InterruptedException e) { System.out.println(getName() + " interrupted!"); break; } } System.out.println(getName() + " terminated"); } } }
[main 스레드 그룹의 list() 메소드 호출] java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] Thread[Monitor Ctrl-Break,5,main] java.lang.ThreadGroup[name=myThreadGroup,maxpri=10] Thread[workThreadA,5,myThreadGroup] Thread[workThreadB,5,myThreadGroup] workThreadA running workThreadB running workThreadA running workThreadB running workThreadB interrupted! workThreadA interrupted! workThreadA terminated workThreadB terminated main terminated Process finished with exit code 0