[스레드] 3. 스레드 우선 순위
-> 동시성(Concurrency) : 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아 가며 실행하는 성질
-> 병렬성(Parallelism) : 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질
스레드 스케쥴링
-> 스레드의 개수가 코어의 수보다 많을 경우
* 스레드를 어떤 순서로 동시성으로 실행할 것인가 : 스레드 스케쥴링
* 스레드 스케쥴링에 의해 스레드들은 번갈아 가면서 그들의 run() 메소드를 조금씩 실행
-> 자바의 스레드 스케쥴링
* 우선순위(Priority)방식 : 코드로 제어가능. 우선순위가 높은 스레드가 실행상태를 더 많이 가지도록 스케쥴링
* 순환할당(Round-Robin)방식: 코드로 제어할 수 없음. 시간할당량(Time Slice)을 정해서 하나의 스레드를 정해진 시간만큼 실행하는 방식
스레드 우선순위
-> 스레드들이 동시성을 가질 경우 우선적으로 실행할 수 있는 순위
-> 우선 순위는 1(낮음)에서부터 10(높음)까지로 부여: default 5의 우선순위 할당
-> 우선 순위 변경 방법
thread.setPriority(우선순위);
thread.setPriority(Thread.MAX_PRIORITY);
thread.setPriority(Thread.NORM_PRIORITY);
thread.setPriority(Thread.MIN_PRIORITY);
-> 우선 순위 효과
* 싱글 코어 경우
우선순위가 높은 스레드가 실행 기회를 더많이 가지기 때문에 우선순위가 낮은 스레드보다 계산작업을 빨리 끝낸다.
* 멀티 코어 경우
쿼드 코어 경우에는 4개의 스레드가 병렬성으로 실행될 수 있기 때문에 4개이하의 스레드를 실행할 경우에는 우선순위 방식은 크게 영향을 미치치 못한다.
최소한 5개 이상의 스레드가 실행되어야 우선 순위의 영향을 받는다.
예제:
package main.priority;
public class CalcThread extends Thread {
public CalcThread(String name) {
setName(name);
}
@Override
public void run() {
for (int i = 0; i < 2000000000; i++) {
}
System.out.println(getName());
}
}
2,000,000,000번의 반복을 누가 가장 먼저 끝내는지 확인하는 테스트이다.
package main.priority;
public class PriorityExmaple {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
Thread thread = new CalcThread("Thread" + i);
if (i != 10) {
thread.setPriority(Thread.MIN_PRIORITY);
} else {
thread.setPriority(Thread.MAX_PRIORITY);
}
thread.start();
}
}
}
Thread10의 우선순위를 제일 높게 잡음으로써 젤 먼저 끝내도록 작성하였다.
결과:
Thread10
Thread3
Thread1
Thread5
Thread4
Thread9
Thread7
Thread2
Thread8
Thread6