2022. 5. 1. 13:25ㆍjava/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 에 포함된 모든 스레드 종료
}
}