자바

[스레드] 3. 스레드 우선 순위

devjones 2021. 12. 29. 22:29

-> 동시성(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