스레드 그룹

2022. 5. 1. 13:25java/java

*스레드 그룹

1) 관련된 스레드를 묶어서 관리할 목적으로 이용

2) 스레드 그룹은 계층적으로 하위 스레드 그룹을 가질 수 있다.

 

3) 자동 생성되는 스레드 그룹

  - system 그룹 : jvm운영에 필요한 스레드들을 포함

  - system/main 그룹 : 메인 스레드를 포함

 

4) 스레드는 반드시 하나의 스레드 그룹에 포함

  - 기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 된다.

  - 명시적으로 스레드 그룹에 포함시키지 않으면 기본적으로 system/main 그룹에 속한다.

 

ThreadGroup group = Thread.currentThread.getThreadGroup();	//스레드 그룹 객체를 생성해 현재 스레드 동작하고 
String groupName  = group.getName();                            //있는 그룹을 얻어내고 이름을 가져온다

 

*스레드 그룹 생성

ThreadGroup tg = new ThreadGroup(String name);
ThreadGroup tg = new ThreadGroup(ThreadGroup parent, String name);	//부모 그룹을 지정하고 부모
                                                                        //그룹 하위에 그룹 생성

 1) 부모(parent) 그룹을 지정하지 않으면 현재 스레드가 속한 그룹의 하위 그룹으로 생성

 2) 스레드를 그룹에 명시적으로 포함시키는 방법

Thread t = new thread(ThreadGroup group, Runnable target);
                      //현재 그룹 하위에, 스레드가 실행할 코드를 가진 Runnable 객체
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); //스레드의 이름만 주고 스레드가 사용할
                                                       //Runnable 객체는 주지 않음. 스레드를 상
                                                       //속해서 만들 때 쓰는 방법

 

*스레드 그룹의 일괄 interrupt()

 1) 스레드 그룹의 interrupt() 를 호출하면 소속된 모든 스레드의 interrupt() 가 호출된다.

 2) ThreadGroup이 제공하는 메서드

 

실습)

public class ThreadGroupExample {

	public static void main(String[] args) {
		ThreadGroup myGroup = new ThreadGroup("myGroup"); //스레드를 실행시키는 건 main스레드 이기 때문에
		                                                  //main그룹 하위에 그룹이 생성될 것
		
	}
}

스레드를 상속한 스레드 그룹 생성

public class WorkThread extends Thread{
	public WorkThread(ThreadGroup threadGroup, String threadName) {
		super(threadGroup, threadName);	//상위 클래스인 Thread의 생성자 메서드를 호출해 스레드 그룹과 스레드 이름을
		                                //인수로 넘겨준다
	}
	
	@Override
	public void run() {
		while(true) {
			try {
				Thread.sleep(1000);	//interrupt() 메서드가 호출 될 때 exception을 발생시키기 위해 일시정지
			} catch (InterruptedException e) {
				System.out.println(getName() + "interrupted");
				break;
			}
		}
		System.out.println(getName() + "종료됨");
	}
}
public class ThreadGroupExample {

	public static void main(String[] args) {
		ThreadGroup myGroup = new ThreadGroup("myGroup"); //스레드를 실행시키는 건 main스레드 이기 때문에
			                                          //main그룹 하위에 그룹이 생성될 것
		
		WorkThread workThreadA = new WorkThread(myGroup, "workThreadA");
		WorkThread workThreadB = new WorkThread(myGroup, "workThreadB");
		
		workThreadA.start();
		workThreadB.start();
		
		System.out.println("[main 스레드 그룹의 list() 메소드 출력 내용]");
		ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
		mainGroup.list();
	}
}

java.lang.ThreadGroup[name=main,maxpri=10] --> 스레드 그룹의 정보[그룹 이름, 가질 수 있는 최대 우선순위]

 

Thread[main,5,main] --> main그룹 내의 스레드가 하나가 있는데 [스레드 이름, 우선순위, 스레드 그룹 이름]

 

java.lang.ThreadGroup[name=main,maxpri=10]
    Thread[main,5,main]
    java.lang.ThreadGroup[name=myGroup,maxpri=10] --> main 그룹 내에 서브그룹이 하나 있다

                          [그룹 이름, 가질 수 있는 최대 우선순위]

        Thread[workThreadA,5,myGroup][스레드 이름, 우선순위, 스레드 그룹 이름]
        Thread[workThreadB,5,myGroup][스레드 이름, 우선순위, 스레드 그룹 이름]

 

public class ThreadGroupExample {

	public static void main(String[] args) {
		ThreadGroup myGroup = new ThreadGroup("myGroup"); //스레드를 실행시키는 건 main스레드 이기 때문에
														  //main그룹 하위에 그룹이 생성될 것
		
		WorkThread workThreadA = new WorkThread(myGroup, "workThreadA");
		WorkThread workThreadB = new WorkThread(myGroup, "workThreadB");
		
		workThreadA.start();
		workThreadB.start();
		
		System.out.println("[main 스레드 그룹의 list() 메소드 출력 내용]");
		ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
		mainGroup.list();
		System.out.println();
		
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {}
		
		System.out.println("[myGroup 스레드 그룹의 interrupt() 메소드 호출]");
		myGroup.interrupt(); //myGroup 에 포함된 모든 스레드 종료
	}
}

'java > java' 카테고리의 다른 글

보조 스트림  (0) 2022.05.01
파일 입출력(2)  (0) 2022.05.01
XML 정의와 사용법 (미완성)  (0) 2022.04.29
데몬 스레드  (0) 2022.04.29
콘솔 입출력  (0) 2022.04.28