본문 바로가기
컴퓨터 언어/JAVA

[JAVA] 쓰레드(Thread) (2)

by 테크케찰 2020. 6. 18.

이번 포스팅은 남궁 성님의 "자바의 정석"이라는 책을 참고하여 작성하였습니다.

글 내용 중에 오류나 수정 사항이 있으면 댓글로 남겨주시면 감사드리겠습니다.

 

지난 포스팅에서 쓰레드가 무엇인지, 어떻게 생성하는지, 멀티쓰레딩은 무엇인지, 쓰레드의 우선순위는 무엇인지에 대해 알아보았습니다.

지난 시간의 포스팅에 이어서 쓰레드에 대해서 더 다뤄보도록 하겠습니다.

아래는 지난 번 포스팅 글이니 참고하실 분들은 참고해주시면 되겠습니다 :)

https://eloquence-developers.tistory.com/9

 

1. 쓰레드 그룹(Thread Group) 

쓰레드 그룹을 이용하는 것은 폴더를 만들어 파일들을 관리하는 것과 비슷하다고 보시면 됩니다.

모든 쓰레드는 쓰레드 그룹에 포함이 되어야 하는데, 쓰레드 그룹을 따로 지정해주지 않으면 자동으로 자신을 생성한 쓰레드와 같은 그룹에 속하게 됩니다.

우리가 지난 포스팅에서 했던 바와 같이 쓰레드 그룹을 따로 지정해주지 않으면 기본적으로 main이라는 쓰레드 그룹에 포함된다고 합니다.

쓰레드 그룹은 아래와 같은 생성자를 이용하여 생성할 수 있습니다.

// 쓰레드 그룹 생성자
ThreadGroup(String name)
ThreadGroup(ThreadGroup parent , String name)

예제를 통해서 쓰레드 그룹을 생성하고 쓰레드 그룹에 대한 정보를 받아보는 과정을 살펴보도록 하겠습니다.

public class Main {
	public static void main(String args[]) {
//		current.Thread(): 현재 실행 중인 쓰레드의 참조를 반환
//		getThreadGroup(): 쓰레드가 속한 쓰레드 그룹 반환
		ThreadGroup main=Thread.currentThread().getThreadGroup();
//		ThreadGroup 생성자
		ThreadGroup threadGroup1=new ThreadGroup("threadGroup1");
		ThreadGroup threadGroup2=new ThreadGroup("threadGroup2");
//		ThreadGroup(ThraedGroup parent, String name) : parent를 쓰레드 그룹의 부모로 지정하고, name을 쓰레드 그룹의 이름으로 지정
		ThreadGroup subThreadGroup1=new ThreadGroup(threadGroup1, "subThreadGroup1");
		
		threadGroup1.setMaxPriority(3); //threadGroup1의 최대우선순위를 3으로 변경
		
		Runnable r=new Runnable() {
			public void run() {
				try {
					Thread.sleep(1000);
				}catch(InterruptedException e) {}
			}
		};
//		Thread(ThraedGroup tg, Runnable r, String name):쓰레드를 쓰레드 그룹 tg에 포함시키는 Thread 생성자
		new Thread(threadGroup1, r, "thread1").start();
		new Thread(threadGroup2, r, "thread2").start();
		new Thread(subThreadGroup1, r, "subThread1").start();
		
		main.list(); //쓰레드 그룹의 쓰레드와 하위 쓰레드그룹에 대한 정보 출력
	}
}

이 코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다.

java.lang.ThreadGroup[name=main,maxpri=10]
    Thread[main,5,main]
    java.lang.ThreadGroup[name=threadGroup1,maxpri=3]
        Thread[thread1,3,threadGroup1]
        java.lang.ThreadGroup[name=subThreadGroup1,maxpri=3]
            Thread[subThread1,3,subThreadGroup1]
    java.lang.ThreadGroup[name=threadGroup2,maxpri=10]
        Thread[thread2,5,threadGroup2]

결과를 보시면 들여쓰기를 이용해 계층이 나타나 있는 것을 확인할 수 있습니다.

최상위에 mainThread가 존재하고, 그 밑에 threadGroup1, threadGroup2, 또 threadGroup1 밑에는 subThreadGroup1이 있음을 확인할 수 있습니다.