티스토리 뷰
쓰레드 우선순위(Piriority)
실행중인 쓰레드가 우선적으로 실행되도록 조정 가능한 값
- 1 ~ 10 까지의 값을 부여 가능하며, 기본값은 5이다.
- 쓰레드 우선순위가 높을 수록 실행될 수 있는 확률이 높으나 절대적으로 작용하지는 않는다.
=> CPU 스케쥴에 따라 실행되며, 자주 실행될 수 있는 "확률"을 높인다.
- 현재 우선순위 확인 : int getPriority()
- 현재 우선순위 변경 : void setPriority(int piriority);
=> 우선순위 값을 1 ~ 10 범위 내에서 지정가능하며 상수 지정도 가능
Thread.MIN_PRIORITY(1), Thread.NORM_PRIORITY(5), Thread.MAX_PRIORITY(10)
- 우선순위에 의한 실행 도중 우선순위가 높은 쓰레드가 지속적으로 추가될 경우,
우선순위가 낮은 쓰레드가 실행되지 못할 수 있는데 이를 기아 (Starvation) 상태라고 한다.
=> 기아 상태를 방지하려면 sleep() 메서드로 모든 쓰레드가 최소한의 시간만큼 일시정지 되도록 구현해야 한다.
쓰레드의 우선순위를 확인하고 변경해보자!
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=1; i <= 100000; i++) {
System.out.println("★★★★★★★★★★");
}
}
});
// 현재 우선순위 확인 : getPriority()
System.out.println("t1 쓰레드의 우선순위 : " + t1.getPriority());
// 현재 쓰레드 우선순위 변경 : setPriority()
t1.setPriority(8);
System.out.println("t1 쓰레드의 우선순위 : " + t1.getPriority());
t1.setPriority(Thread.MAX_PRIORITY);
System.out.println("t1 쓰레드의 우선순위 : " + t1.getPriority());
t2, t3 쓰레드를 따로 설정한 후 우선순위를 정하고 실행하면
// t1, t2, t3 쓰레드의 우선순위 서로 다르게 변경
t1.setPriority(Thread.NORM_PRIORITY); // 5 ★★★★★★★★★★
t2.setPriority(Thread.MIN_PRIORITY); // 1 ○○○○○○○○○○
t3.setPriority(Thread.MAX_PRIORITY); // 10 ==========
t1.start();
t2.start();
t3.start();
우선순위가 절대적이진 않지만 반영은 된다!
출력되는 횟수가 너무 적으면 반영되지 않기도 하니 주의할 것!
멀티쓰레딩 환경에서의 문제점
- 복수 개의 쓰레드에서 동일한 객체의 데이터에 접근할 경우 각 쓰레드에서 사용되는 데이터의 일관성이 깨질 수 있다!
=> A라는 쓰레드에서 접근해서 사용하는 데이터를 B라는 쓰레드에서 동시에 접근해서 변경할 경우,
올바른 데이터가 아니게 될 수 있음 (= 데이터 일관성이 깨졌다!)
- 공유 데이터에 대한 일관성 문제를 해결하기 위해서 Lock 개념과 동기화(Synchronize) 기능을 사용
=> 메서드 또는 특정 코드 블럭에 synchronize 키워드를 사용하여 동기화를 적용한다.
댓글