스레드 그룹
-관련된 스레드를 묶어서 관리할 목적으로 이용
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 |