쓰레드의 우선순위
쓰레드는 내부적으로 우선순위(priority)에 해당하는 속성값을 가지고 있다.
이 우선순위 값에 따라 쓰레드가 얻는 실행시간이 달라진다. 즉 우선순위는 중요도 이며 우선순위 값이 높을 수록 해당 쓰레드가 작업시간을 많이 갖게된다.
예를 들어 카카오톡 같은 메신저 프로그램에서 파일전송과 메시지전송중 메시지전송이 우선순위가 더높다.
파일전송보다 채팅의 메시지 전송의 우선순위가 더 높아야 원활한 의사소통이 가능하기 때문이다.
쓰레드 우선순위 관련 메서드와 상수
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
쓰레드가 가질 수 있는 우선순위의 범위는 1~10이며 숫자가 높을수록 우선순위가 높다.
쓰레드의 우선순위 값은 쓰레드를 생성한 쓰레드로부터 상속받는다. main메서드를 실행시키는 main쓰레드의 경우 우선순위 값이 5이다. 그러므로 main메서드에서 생성하는 쓰레드의 경우 우선순위 값은 5가된다.
setPriority(MAX_PRIORITY)로 변경하고 각각 출력 횟수를 1000회로 하였다. 우선순위가 높은 th2가 먼저 끝나는것을 알수 있다.
그러나 실행시킬 때마다 다른결과가 나오는것을 확인했다. 그이유는 멀티코어환경에서 쓰레드의 우선순위에 따른 차이가 전혀없다는 것이다.
이론적으로만 "쓰레드에 높은 우선순위를 줄경우 더많은 실행시간과 실행기회를 갖게된다"는 것을 인지하고 있어야할것 같다.
우선순위에 차등을 두어 쓰레드를 실행하려면 OS의 스케줄링 정책과 JVM의 구현을 직접 확인해봐야한다고 한다...
자바의 쓰레드의 우선순위와 관련된 구현이 JVM마다 차이가 있을 수 있기 때문이다. JVM을 확인하더라도 쓰레드는 OS의 스케줄러에 종속적이기 떄문에 어느정도 예측만 가능하고 정확히 알수는 없다고한다.
쓰레드 그룹(thread group)
쓰레드그룹 : 관련된 쓰레드를 그룹으로 묶어 다루기 위함
쓰레드그룹 관련 메서드
ThreadGroup(String name) : 지정된 이름의 새로운 쓰레드 그룹을 생성
ThreadGroup(ThreadGroup parent, String name) : 지정된 쓰레드 그룹에 포함되는 새로운 쓰레드 그룹 생성
int activeCount() : 쓰레드 그룹에 포함된 활성상태(작업이 덜끝난, 쓰레드가 종료되지않은) 쓰레드의 수를 반환
int activeGroupCount() : 쓰레드 그룹에 포함된 활성상태에 있는 쓰레드 그룹의 수를 반환
void checkAccess() : 현재 실행중인 쓰레드가 쓰레드 그룹을 변경할 권한이 있는지 체크한다.
void destroy() : 쓰레드 그룹과 하위 쓰레드 그룹까지 모두 삭제한다.
int getMaxPriority() : 쓰레드 그룹의 최대 우선순위를 반환
String getName() : 쓰레드 그룹의 이름을 반환
ThreadGroup getParent() : 쓰레드 그룹의 상위 쓰레드그룹을 반환
void interrupt() : 쓰레드 그룹에 속한 모든 쓰레드를 interrupt
void list() : 쓰레드 그룹에 속한 쓰레드와 하위 쓰레드그룹에 대한 정보를 출력
void setMaxPriority(int pri) : 쓰레드 그룹의 최대 우선순위를 설정
쓰레드를 쓰레드 그룹에 포함시키려면 Thread의 생성자를 사용해야한다.
Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
모든 쓰레드는 쓰레드그룹에 포함되어있다.
쓰레드 그룹을 지정해주지않는경우 생성한 쓰레드와 같은 쓰레드그룹에 속하게된다.
자바프로그램을 실행시키면 JVM은 main과 system이라는 쓰레드 그룹을 만들고 각각 쓰레드그룹에 쓰레드를 포함시킨다.
main쓰레드의 경우 main 쓰레드 그룹에 속한다.
가비지 컬렉션을 수행하는 Finalizer쓰레드는 system쓰레드 그룹에 속하게 된다.
코드로 생성한 모든 쓰레드는 main메서드에서 생성되기 떄문에 일반적으로 main 쓰레드 그룹에 속하게 된다.
쓰레드 그룹을 지정할 경우 main 쓰레드 그룹이아닌 지정한 쓰레드 그룹에 포함된다.
main.list()를 통해 main쓰레드 그룹의 정보를 출력한다.
th1의 경우 setMaxPriority를 3으로 주었기 때문에 main쓰레드에서 생성했지만 Priority가 3으로나온다.
th3은 main쓰레드의 우선순위 값을 받아와 5로 설정되어있다.
'Programming > JAVA' 카테고리의 다른 글
쓰레드의 상태 및 제어 (0) | 2021.08.16 |
---|---|
데몬 쓰레드(daemon thread) (0) | 2021.08.13 |
쓰레드(Thread) (0) | 2021.08.13 |
에너테이션(annotation) (0) | 2021.08.11 |
열거형(Enums) (0) | 2021.08.10 |