스레드 그룹
스레드 그룹(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 종료됨
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA] 블로킹 방식의 작업 완료 통보_1 (스레드풀_2) (0) | 2019.03.14 |
---|---|
[JAVA] 스레드풀 생성, 종료 및 작업 처리 (스레드풀_1) (0) | 2019.03.14 |
[JAVA] interrupt() 메소드를 이용하여 스레드 정지시키기 (0) | 2019.03.04 |
[JAVA] 스레드간 협업(wait, notify, notifyAll) (0) | 2019.03.04 |
[JAVA] 다른 스레드의 종료를 기다림(join()) (0) | 2019.03.02 |