본문 바로가기

프로그래밍(TA, AA)/JVM 언어

[병렬프로그래밍] 스레드그룹 이해하기

스레드 그룹


자바에서는 스레드들을 여러개 묶어 그룹으로 관리할 수 있습니다. 자바에서 제공하는 클래스들 중에는 쓰레드가 있고 스레도 그룹도 있습니다. 스레드 그룹 객체를 생성하면 그 밑에 스레드들을 모아 놓을 수 있습니다. 여러 개의 쓰레드들을 한꺼번에 모아서 관리하고 싶을때 이용하기도 합니다. 평상시에 스레드 그룹을 사용할 일이 많지는 않지만 대용량 프로그램의 경우에는 스레드 그룹을 이용하면 유용하게 스레드를 컨트롤할 수가 있습니다.


1) 스레드 그룹 개요

- 애플리케이션에서 많은 스레드 생성시 사용

- 스레드를 그룹으로 묶어서 사용하는 것이 편리

- 그룹안의 스레드를 제어하기 위한 지원메소드 부족 (자바 라이브러리 중 가장 실패한 부분 중 하나)


2) 스레드 그룹 구성

- 자바에서의 모든 스레드는 특정 스레드 그룹의 멤버로서 존재

- 최상위 스레드 그룹은 main 스레드 그룹(default 스레드 그룹)

- 자바 애플리케이션 최초 실행시 런타임 시스템은 main 스레드 구룹 생성

- main 스레드 그룹 인스턴스는 main 스레드 생성해서 애플리케이션 실행 포인트인 main() 메소드를 호출

- 이후에 생성되는 스레드와 스레드 그룹은 main 스레드 그룹에 포함

- 스레드 그룹은 하위 스레드 그룹과 스레드들을 멤버로 가짐

- 모든 스레드 main 스레드 그룹을 루트로해서 트리 구조로 구성.



스레드 그룹 생성자

ThreadGroup(String name)
ThreadGroup(ThreadGroup parent , String name)


- 생성자는 parent, name 조합으로 구성

- 1번의 name 속성은 파라미터로 주어진 name에 해당하는 이름을 갖는 새로운 스레드 그룹 생성

- 2번의 생성자는 parent에 해당하는 부모 스레드 그룹과 name에 해당하는 이름을 갖는 새로운 스레드 그룹 생성

- 스레드 그룹에 속한 모든 스레드들을 setDeamon() 이용해서 모두 데몬스레드로 만들수 있으며 interrupt() 메소드로 스레드 그룹안의 모든 스레드를 정지 시킬 수 있음.

- 스레드 그룹에 속한 모든 스레드가 파과되면 스레드 그룹도 파괴

- desctory() 메소드로 직접 해당 스레드 파괴 가능 




스레드 우선순위

스레드들이 새로 생성이 되면 우선순위를 갖게 됩니다. 디폴트로는 중간 우선순위가 부여됩니다.

- 스레드에 우선순위를 부여하여 우선순위가 높은 스레드에게 실행의 우선권을 주어서 실행

- Thread 클래스에서는 스레드의 우선순위를 부여하는 setPriority(int newPriority) 메서드를 제공


Thread 클래스의 우선순위를 정하는 멤버변수

void setPriority(int newPriority); //쓰레드의 우선순위를 지정한 값으로 변경
int getPriority(); //쓰레드의 우선순위를 반환.
public static final int MAX_PRIORITY = 10; // 최대 우선순위
public static final int MIN_PRIORITY = 1; //최소 우선순위

public static final int NORM_PRIORITY = 5; //보통 우선순위


왜 스레드에는 우선순위가 필요할까요?

스레드는 여러개가 있고, 여러개의 스레드는 모두 실행이 되어야 합니다. CPU는 하나인데 스레드는 여러개입니다. 결국 스레드들은 서로 경쟁관계에 있고, 여러 스레드들 중에서 누가 먼저 스레드를 실행해야하는지에 대한 결정 기준이 필요합니다. 이때 그 기준 중에 하나가 바로 우선순위가 됩니다.



작업범주에 따른 스레드 우선순위 설정

자바에서는 우선순위의 숫자가 높으면 높을수록 우선순위가 높습니다. 


10 : 위기관리, 에러관리

7~9 : 상호작용, 이벤트 처리

4~6 : io 관련 작업

2~3 : 백그라운드 작업

1 : 기타 다른 작업이 있을때 실행


단, 시스템과 스레드 자체에 대한 높은 수준의 이해없이 스레드를 건드리면 예상치 못한 버그가 발생할 가능성이 높습니다.