일반적으로 운영체제에서 스레드들에 대해 각각의 프로세서 또는 코어를 할당하여 스레드를 동시에 실행시킨다. 만일 컴퓨터에 스레드를 실행하기 위한 프로세서 또는 코어에 대한 여유가 없으면 스레드는 공유 프로세서 또는 코어를 사용하기 위해 대기를 한다.
운영체제는 이렇게 대기하고 있는 스레드를 어느 시점에 실행 시킬지를 결정하기 위해 스케쥴러를 사용한다. 스케쥴러는 운영체제에 따라 다른데 다음 리스트는 리눅스와 윈도우에서 사용되는 스케쥴러의 예이다.
***
출력결과가 첫 번째 스레드가 실행되는 것이 먼저 출력이 되었지만 스케쥴러에 따라 출력 순서가 달라 질 수 있다
다단계 피드백 큐 스케쥴러를 포함한 다른 많은 스레드 스케쥴러에서 스레드 우선 순위 개념을 사용한다. 흔히 스케쥴러들은 선점형 스케쥴링(preemptive scheduling; 높은 우선 순위의 스레드를 먼저 실행)과 라운드 로빈 스케쥴링(round robin scheduling; 우선 순위가 같은 스레드는 시간을 분배하여 분배된 시간동안 번갈아 가면서 스레드를 실행) 이 결합된 형태로 구현되어 있다.
Thread 클래스는 void setPriority(int priority) 메소드와 int getPriority() 메소드를 통해 우선 순위를 지정하거나 우선 순위를 알아낼 수 있다. setPriority(int priority) 메소드는 Thread.MIN_PRIORITY에서 Thread.MAX_PRIORITY 범위에 있는 우선 순위 값을 스레드에 지정할 때 사용되는데, 기본 우선 순위값은 Thread.NORMAL_PRIORITY이다. int getPriority() 메소드는 스레드의 현재 우선 순위값을 반환한다.
***
스케쥴러마다 우선 순위를 조작하는 방법이 다를 수 있기 때문에 setPriority() 메소드를 사용할 경우 자바의 장점 중 하나인 플랫폼 이동성에 영향을 줄 수 있다. 예를 들어 몇몇 플랫폼 스케쥴러의 경우 우선 순위가 높은 스레드가 종료할 때까지 우선 순위가 낮은 스레드는 대기한다. 이런 스케쥴러의 경우 우선 순위가 낮은 스레드가 실행되기 위해 우선 순위가 높은 스레드가 종료할 때까지 많은 시간을 기다려야 하는 경우가 발생하기 때문에 무한 연기(indefinite postponement)또는 스터베이션(starvation)을 일으킬 수 있으며 또한 애플리케이션의 실행 속도를 심각하게 저하시킬 수 있다.
다음 코드는 main()메소드에서 각 스레드의 이름을 지정하고 name과 count를 출력 한 후 스레드를 대기(sleep)한다.
-----------------------------
package Thread;
public class CountingThreads02 {
public static void main(String[] args){
Runnable r=new Runnable() {
@Override
public void run() {
String name=Thread.currentThread().getName();
int count=0;
while(true){
System.out.println(name+": "+count++);
try {
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
}
};
Thread thdA=new Thread(r);
thdA.setName("A");
Thread thdB=new Thread(r);
thdB.setName("B");
thdA.start();
thdB.start();
}
}
Threads A와 B를 100밀리 초동안 대기시키기 위해 Thread.sleep(100); 를 지정하였다. 이렇게 대기하여 각 스레드 실행을 좀 더 주기적으로 할 수 있다.
스레드는 계산이 많은 작업이나 파일 다운로드와 같이 시간이 많이 걸리는 작업을 수행하기 위해 메인 스레드에서 작업을 분리하여 다른 스레드에서 작업을 처리한다. 분리된 작업이 종료된 후 호출한 스레드는 분리된 스레드의 결과 처리를 할 준비를 하며 분리된 스레드가 종료될 때까지 대기한다.
'Java > Working-level Java' 카테고리의 다른 글
FileWriter : FIndAll (0) | 2015.01.22 |
---|---|
Thread 3 (0) | 2015.01.14 |
Thread (0) | 2015.01.06 |
System (0) | 2015.01.06 |
StringBuffer / StringBuilder (0) | 2015.01.03 |