티스토리 뷰

쓰레드 우선순위(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 키워드를 사용하여 동기화를 적용한다.

 

댓글
최근에 올라온 글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함