프로그래밍 노트/JAVA

[JAVA] 스레드 그룹(thread group)

깡냉쓰 2019. 3. 13. 20:47
728x90
반응형

스레드 그룹

스레드 그룹(ThreadGroup)은 관련된 스레드를 묶어서 관리할 목적으로 이용된다.

JVM이 실행되면 system 스레드 그룹을 만들고, JVM 운영에 필요한 스레드들을 생성해서 system 스레드 그룹에 포함시킨다. 그리고 system의 하위 스레드 그룹으로 main을 만들고 메인 스레드를 main 스레드 그룹에 포함시킨다.

모든 스레드는 그룹을 갖으며 스레드 그룹을 명시적으로 선언하지 않으면 자신을 생성한 스레드와 같은 그룹에 속한다.

public class ThreadInfoExample {
    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();

        for(Thread thread : threads){
            System.out.println("Name : " + thread.getName() + ((thread.isDaemon()) ? "[Daemon]" : "[Main]"));
            System.out.println("\t" + "Group : " + thread.getThreadGroup().getName());
            System.out.println();
        }
    }
}

Daemon 포스팅에서 사용한 AutoSaveThread를 활용하여 Thread의 정보를 찍었음

result

Name : AutoSaveThread[Daemon] // main 스레드에 속하는걸 볼 수 있음 

    Group : main

Name : Signal Dispatcher[Daemon] 

    Group : system

Name : Common-Cleaner[Daemon] 

     Group : InnocuousThreadGroup

Name : main[Main] 

     Group : main

Name : Finalizer[Daemon] // GC를 담당하는 스레드 

     Group : system

Name : Monitor Ctrl-Break[Daemon] 

     Group : main

Name : Reference Handler[Daemon] 

     Group : system

 

 

스레드 그룹 생성

ThreadGroup 객체를 이용하여 스레드 그룹을 생성할 수 있다.

스레드 그룹 생성 시 부모 스레드 그룹을 지정하지 않으면 현재 스레드가 속한 그룹의 하위 그룹으로 생성된다.

스레드 그룹에 포함된 스레드들을 일괄 interrupt 할 수 있는데, 이는 매우 편리한 동작방식이다. (for문으로 여러 개의 thread에 interrupt를 시켜주는것보다 훨씬 편리..)

interrupted가 되면 중지되는 thread

public class WorkThread extends Thread {

    public WorkThread(ThreadGroup threadGroup, String threadName){
        super(threadGroup, threadName); // 스레드 그룹과 이름 설정
    }

    @Override
    public void run() {
        while(true){
            try{
                Thread.sleep(1000);
            }catch(InterruptedException e){
                System.out.println(getName() + " interrupted");
                break;
            }
        }
        System.out.println(getName() + " 종료됨");
    }
}

스레드 일괄 종료

public class ThreadGroupExample {
        public static void main(String[] args) {
            ThreadGroup group = new ThreadGroup("myGroup");
            WorkThread workThread1 = new WorkThread(group, "workThread1");
            WorkThread workThread2 = new WorkThread(group, "workThread2");

            workThread1.start();
            workThread2.start();

            System.out.println("[ main 스레드 그룹 ]");
            ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
            mainGroup.list();

            try{
                Thread.sleep(3000);
            }catch (InterruptedException e){

            }

            System.out.println("[ myGroup 스레드 그룹의 interrupted 호출]");
            group.interrupt();
        }
}

result

[ main 스레드 그룹 ] // 현재 스레드에 포함된 하위스레드 그룹의 내용을 보여줌 

java.lang.ThreadGroup[name=main,maxpri=10] 

     Thread[main,5,main] 

     Thread[Monitor Ctrl-Break,5,main] 

 java.lang.ThreadGroup[name=myGroup,maxpri=10] 

     Thread[workThread1,5,myGroup] 

     Thread[workThread2,5,myGroup] 

[ myGroup 스레드 그룹의 interrupted 호출] 

workThread2 interrupted 

workThread1 interrupted 

workThread2 종료됨 

workThread1 종료됨

 

728x90
반응형