WEB/JAVA

내가 보려고 정리하는 JAVA 멀티 스레드 4- 데몬 스레드, 스레드 그룹

데몬 스레드

주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드입니다.

그렇기 때문에 주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료됩니다.

적용 예로는 자동 저장, 가비지 컬렉터 등이 있는데 이 기능들은 주 스레드가 종료되면 같이 종료됩니다.

 

데몬 스레드 내용을 작성해준 후

public class DaemonThread extends Thread{
	public void save(){
    	// 자동 저장
        }
	public void run(){
    	save();
	}
}

메인 스레드에서 setDaemon 을 해주면 된다.

public class mainThread(){
	public static void main(String[] args){
    	DaemonThread daemonThread = new DaemonThread();
        daemonThread.setDaemon(true); // start() 보다 먼저 선언해주지 않으면 Exception 발생
        daemonThread.start();
	}
}

 

스레드 그룹

관련된 스레드를 묶어서 관리할 목적으로 이용한다.

스레드는 반드시 하나의 스레드 그룹에 포함되는데,

명시적으로 선언해주지 않으면 생성한 스레드와 같은 스레드 그룹에 속하게 된다.

 

// 스레드 그룹 이름 얻기
ThreadGroup group = Thread.currentThread().getThreadGroup();
String groupName = group.getName();

// 프로그래스 내에서 실행중인 모든 스레드 정보 얻기
// key = 스레드 객체 value = 스레드의 상태 기록을 갖고 있는 배열
Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();

 

명시적으로 스레드 그룹을 만들고 싶을 경우

// 이름만 줄 경우
ThreadGroup group = new ThreadGroup(String name);

// 부모 ThreadGroup과 같이 줄 경우
// 부모 스레드 그룹을 지정하지 않을 경우 현재 스레드가 속한 그룹의 하위 그룹으로 생성
ThreadGroup group = new ThreadGroup(ThreadGroup parent, String name);

// 생성과 동시에 그룹을 줄 경우 (매개값 여러가지임)
Thread t = new Thread(ThreadGroup group,Runnable target, String name);

 

스레드를 그룹에 포함하면 어떤게 좋을까? 그룹내에 포함된 모든 스레드를 일괄 컨트롤할 수 있다는 점이다.

interrupt() 메서드 를 사용하여 그룹 안에 모든 스레드를 종료시킬 수 있다.  (이 메서드는 포함된 모든 스레드의 interrupt() 메서드를 내부적으로 호출해주기 때문.)

 

public class ThreadGroup{
	public static void main(String[] args){
    
    	// aejoeng 그룹에 두 스레드를 포함시킴
    	ThreadGroup group = new ThreadGroup("aejeong");
        WorkThread workThreadA = new WorkThread(group,"workThreadA");
		WorkThread workThreadB = new WorkThread(group,"workThreadB");
        
        workThreadA.start();
        workThreadB.start();
        
        ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
        // 현재 그룹에 포함된 스레드와 하위 그룹에 대한 정보를 출력
        mainGroup.list();
        
        // WorkThread에서 개별적으로 예외 처리한 InterruptedExcetion을 발생시켜 스레드를 종료한다.
        group.interrupt();
	}
}