모두 아시다시피 멀티스레드는 겉으로는 동시에 실행되는 것처럼 보이지만 실제 모든 작업들은 번갈아 가면서 진행됩니다.
그 속도가 매우 빨라 병렬적으로 실행되는 것처럼 보일 뿐이죠.
그렇다면 멀티스레드의 병렬 실행은 어떤 순서로 이루어질까요?
멀티스레드의 순서를 정하는 것을 스레드 스케줄링(thread scheduling)이라고 합니다.
스레드 스키줄링 방식에는 두가지 방식이 있습니다.
우선순위(priority)방식과 순환 할당(Round-Robin)방식입니다.
순환 할당방식은 스레드가 사용할 시간할당량을 정하고 할당량의 시간만큼 스레드를 실행시키고 또 다른 스레드를 실행시키는 방식입니다. 순환 할당방식은 JVM(자바 가상 기계)에 의해 결정되기 때문에 개발자의 임의로 수정할 수 없습니다.
그래서 개발자가 사용할 수 있는 유일한 방법은 우선순위 부여인데요, 우선순위 방식은 말 그대로 어떤 스레드를 우선적으로 처리할지 우선순위를 부여하는 방식입니다. 우선순위는 1에서 10까지 부여할 수 있고 1이 가장 낮고 10이 가장 높습니다.
우선순위는 Thread 클래스의 setPriority() 메소드로 간단히 부여할 수 있습니다.
thread.setPriority(1~10);
thread.setPriority(Thread.MIN_PRIORITY);
thread.setPriority(Thread.NORM_PRIORITY);
thread.setPriority(Thread.MAX_PRIORITY);
위에 보이는 것처럼 우선순위는 숫자로 지정하는 방법이 있고 Thread 클래스의 상수를 쓸 수도 있습니다. MIN_PRIORITY 는 최소우선순위로서 숫자 1과 동일하며 NORM_PRIORITY는 5, MAX_PRIORITY는 10으로 대체할 수 있습니다.
다음은 우선순위 부여를 통해 스레드 스케쥴링을 한 간단한 예제입니다.
thread5에 최고우선순위를 부여하고 나머지 thread에는 최소우선순위를 부여해 thread5를 가장 빨리 수행하고자 했습니다.
혹시나 run 메소드 안의 코드는 의미없는 것이니 주의깊게 보지 않으셔도 됩니다.
class exThread extends Thread {
public exThread(String threadName) {
this.setName(threadName);
}// exThread.constructor
public void run() {
for (int p = 0; p < 1000; p++) {
int x = 77;
x += p;
for (int q = 0; q < 2000000000; q++) {
x -= q;
}
}
System.out.println(this.getName() + " terminated ");
}// exThread.run
}// class exThread
public class ThreadPriority {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
Thread thread = new exThread("[ thread " + i + " ]");
if (i != 5)
thread.setPriority(Thread.MIN_PRIORITY);
else
thread.setPriority(Thread.MAX_PRIORITY);
thread.start();
} // for
}// main
}// class ThreadPriority
실행결과
'PROGRAMMING > Java' 카테고리의 다른 글
자바 예제 코드 - 소수 판별하는 메소드 (1) | 2018.02.14 |
---|---|
자바 예제 코드 - 피보나치(Fibonacci) 수열 (0) | 2018.02.13 |
자바 예제 코드 - 이진 검색 트리 (Binary Tree Search) (0) | 2018.02.11 |
자바 예제 코드 - 버블소트(거품정렬,Bubble sort) (0) | 2018.02.11 |
자바 예제 코드 - 두 이진수 더하기(add two binary numbers) (0) | 2018.02.11 |