본문 바로가기

Java 공부

12장 스레드 그룹

스레드 그룹

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

      ex) main그룹 밑에 main스레드, sub그룹 밑에 sub스레드

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

-자동 생성되는 스레드 그룹

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

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

-스레드는 반드시 하나의 스레드 그룹에 포함된다.

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

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


스레드 그룹 이름 얻기

ThreadGroup group = Thread.currentThread.getThreadGroup();       //스레드를 실행하고 있는 현재스레드 객체를 얻어서, 스레드 그룹을 얻어내라

String groupName = group.getName();                                    


스레드 그룹 생성

ThreadGroup tg = new ThreadGroup(String name);                       

       --> name이라는 이름을 가지는 스레드 그룹 객체 생성  

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

ThreadGroup tg = new ThreadGroup(Group parent, String name);    

       --> parent 스레드 그룹의 하위그룹에 속하고, name이라는 이름을 가진 스레드 그룹 생성




 이전에 우리는 스레드를 만들 때 두가지 방법을 사용할 수 있다고 했다.

1) Runnable 객체를 이용하는 방법

Thread thread = new Thread(new Runnable() {

public void run() {

....

});

2) 스레드 객체를 직접 상속받는 방법

class XXXThread extends Thread {

}


스레드를 그룹에 명시적으로 포함시키는 방법에는 1)과 2)방법에 따라 달라진다.


1)번 방법으로  Runnable객체를 이용하여 스레드를 생성할 때, 

생성할 스레드를 그룹에 명시적으로 포함시키기 위해 1)방법에 아래와 같이 매개값을 추가하여 사용할 수 있다.



Thread t = new Thread(ThreadGroup group, Runnable target);

-->스레드 t가 속할 그룹, 스레드가 실행할 코드를 가지고 있는 Runnable객체,

Thread t = new Thread(ThreadGroup group, Runnable target, String name);  

 -->  스레드 t의 이름

Thread t = new Thread(ThreadGroup group, Runnable target, String name, long stackSize);

--> 스레드 t가 사용할 스택사이즈


1)번 방법으로 Runnable 객체를 이용하여 스레드를 생성하고, 생성할 스레드를 특정 그룹에 명시적으로 포함시키는 코드를 작성해보면

Thread thread = new Thread(ThreadGroup tg, new Runnable() {

public void run () {

.....    

});



2)번 방법으로 스레드 클래스를 직접 상속받아 스레드를 생성할 때,

생성할 스레드를 그룹에 명시적으로 포함시키기 위해 아래와 같은 코드를 추가하여 사용할 수 있다.



Thread t = new Thread(ThreadGroup group, String name);                 

--> 스레드 t가 속할 그룹, 스레드 t의 이름     *스레드를 직접 상속해서 만들 경우에 사용할 수 있는 코드




2)번 방법으로 스레드 클래스를 직접 상속받아 스레드를 생성하고, 

생성할 스레드를 특정 스레드 그룹에 명시적으로 포함시키기 위해서는 다음과 같다.

class XXXThread extends Thread {

XXXThread(ThreadGroup tg, String name){

super(tg,"name");          //부모스레드 생성자에게 매개값을 넘겨주면 된다.

}

}



그렇다면 왜 스레드를 스레그 그룹에 포함시킬까?


스레드 그룹의 일괄 interrupt() 메소드

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

따라서, interrupt()메소드를 한번만 호출하면 모두 종료가 가능하므로 코드가 간결해진다!




본 포스팅은 이것이 자바다 책을 참고하여 작성하였습니다.



'Java 공부' 카테고리의 다른 글

12장 스레드풀(2)  (0) 2018.12.11
12장 스레드풀(1)  (0) 2018.12.09
12장 데몬 스레드  (0) 2018.12.08
12장 스레드 상태 제어(2)  (0) 2018.12.07
12장 스레드 상태 제어(1)  (0) 2018.12.03