12.3 스레드 우선순위


* 동시성과 병렬성

- 동시성

// 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아 가며 실행하는 성질

- 병렬성

// 멀티 작업을 위해 코어에서 개별 스레드를 동시에 실행하는 성질



* 스레드 스케줄링

- 스레드의 개수가 코어의 수보다 많을 경우

// 스레드를 어떤 순서로 동시성으로 실행할 것인가를 결정 -> 스레드 스케줄링

// 스레드 스케줄링에 의해 스레드들은 번갈아 가면서 그들의 run() 메소드를 조금씩 실행

* 자바의 스레드 스케쥴링

- 우선순위 방식과 순환할당 방식을 사용

// 우선순위 방식 (코드로 제어 가능)

: 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케쥴링하는 방식


// 순환할당 방식 (코드로 제어할 수 없음)

: 시간 할당량을 정해서 하나의 스레드를 정해진 시간만큼 실행하는 방식


* 스레드 우선순위

- 스레드들이 동시성을 가질 경우 우선적으로 실행할 수 있는 순위

- 우선순위는 1(낮음)에서부터 10(높음)까지 부여

// 모든 스레드들은 기본적으로 5의 우선순위를 할당


- 우선순위 변경 방법

- 우선순위 효과

// 싱글코어 경우

: 동시성으로 실행될 경우, 우선순위가 높은 스레드가 실행 기회를 더 많이 가지기 때문에

: 우선순위가 낮은 스레드보다 계산 작업을 빨리 끝낸다.


// 멀티코어 경우

: 쿼드코어 경우에는 4개의 스레드가 병렬식으로 실행될 수 있기 때문에

: 4개 이하의 스레드를 실행할 경우에는 우선 순위 방식은 크게 영향을 미치지 못한다.

: 최소한 5개 이상의 스레드가 실행되어야 우선순위의 영향을 받는다


// 스레드 10개를 생성해서 20억 번의 루핑을 누가 더 빨리 끝내는가 테스트한 예제.

// Thread1~9는 우선순위를 가장 낮게 주었고, Thread10은 우선순위를 가장 높게 주었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
package sec03.exam01_priority;
 
public class CalcThread extends Thread {
    public CalcThread(String name) {
        setName(name); // 스레드 이름 변경
    }
    
    public void run() { // 스레드가 실행할 내용
        for(int i=0; i<2000000000; i++) {
        }
        System.out.println(getName());
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package sec03.exam01_priority;
 
public class PriorityExample {
    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();
        }
    }
}
cs



Posted by 너래쟁이
: