쓰레드는 두개 이상 생성될 수 있다. 그렇기 때문에 자바 가상머신은(자바 가상머신안에 존재하는 스케줄러)

쓰레드의 실행을 스케줄링 해야 한다. 스케줄링에 사용되는 알고리즘은


우선순위가 높은 쓰레드의 실행을 우선한다.

동일한 우선순위의 쓰레드가 둘 이상 존재할 때는 CPU의 할당 시간을 분배해서 실행한다.

우선순위가 낮은 쓰레드 이더라도 높은 우선순위의 쓰레드가 CPU를 양보해서 실행의 기회를 얻게되면

최소 단위으 실행 시간은 보장을 받는다.


자바의 쓰레드에는 우선순위라는것이 할당된다. 이는 가상머신에 의해서 우선적으로 실행되어야 하는 쓰레드의 순위를 의미한다.

가장 높은 순위는 정수 10 가장낮은 순위는 정수 1로 표현한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MessageSendingThread extends Thread{
    String message;
    public MessageSendingThread(String str){
        message = str;
    }
    public void run(){
        for(int i=0;i<100000;i++)
            System.out.println(message+"("+getPriority()+")");
    }
}
public class PriorityTest {
    public static void main(String[] args){
        MessageSendingThread tr1 = new MessageSendingThread("first");
        MessageSendingThread tr2 = new MessageSendingThread("second");
        MessageSendingThread tr3 = new MessageSendingThread("third");
        tr1.start();
        tr2.start();
        tr3.start();
    }
}
cs


getPriority() 메소드는 Thread 클래스의 인스턴스 메소드로 쓰레드의 우선순위를 반환한다.


1
2
3
4
5
6
public class MessageSendingThread extends Thread{
    String message;
    public MessageSendingThread(String str, int prio){
        message = str;
        setPriority(prio);
    }
cs


setPriority(int n) 메소드는 Thread 클래스의 인스턴스 메소드로 쓰레드의 우선순위를 변경한다.


1
2
3
4
5
Thread 클래스의 static 상수
Thread.MAX_PRIORITY 쓰레드의 최고 우선 순위 10
Thread.NORN_PRIORITY 중간순위 5
Thread.MIN_PRIORITY 최저순위 1
 
cs



쓰레드의 라이프 싸이클


쓰레드가 생성되면 네가지 상태중 한가지 상태에 있게 된다.


NEW 상태

쓰레드 클래스가 키워드 new 를 통해서 인스턴스화 된 상태를 가르킨다.

이 상태 에서는 자바 가상머신에 의해 관리가 되는 쓰레드의 상태는 아니다.

쓰레드라부르기에는 이른감이있는 상태이지만 자바에서는 이 상태부터 쓰레드라 표현한다.


Runnable 상태

쓰레드 인스턴스를 대상으로 start 메소드가 호출되면 해당 쓰레드는 Runnable 상태 가 된다. 

이는 모든 실행의 준비를 마치고스케줄러에 의해서 선택되어 실행되기를 기다리는 상태이다.

Runnable 상태에서 스케줄러에 의해서 실행의 대상으로 선택이 되어야 run 메소드가 호출이 된다.


Bloked 상태

실행중인 쓰레드가 sleep 또는 join 메소드를 호출하거나 CPU의 할당이 필요치 않는 입출력 연산을 하게되면

CPU를 다른 쓰레드에게 양보하고 본인은 Blocked 상태가 된다. Blocked 상태에서는 스케줄러의 선택을 

받을 수 없다, 다시 스케줄러의 선택을 받아서 실행이 되려면 Bloked 상태에 놓이게 된 원인이 제거되어서 

Runnable 상태로 돌아와야 한다.


Dead 상태

run메소드의 실행이 완료되어서 run 메소드를 빠져나오게 되면 해당 쓰레드는 Dead 상태가 된다.

그리고 이상태는 쓰레드의 실행을 위해서 할당 받았던 메모리를 비롯해서 각종 쓰레드 관련 정보가 완전히

사라지는 상태이다. 한번 Dead 상태가 된 쓰레드는 다시 Runnable 상태가 되지 못한다.

쓰레드의 실행을 위해 필요한 모든 것이 소멸되기 때문이다.



쓰레드의 메모리 구성 

쓰레드의 가장 큰 역할은 별도의 실행흐름 생성이다. 별도의 실행 흐름은 메소드의 호출을 통해 형성된다.

run메소드가 호출되고 run메소드 내에서 또 다른 메소드를 호출하면서 main메소드와는 다른 흐름을 형성한다.

이렇듯 main메소드와 다른 실행흐름을 형성하기 위해서는 별도의 스택이 쓰레드에게 할당 되어야 한다.

main쓰레드 이외에 두개의 쓰레드가 추가로 생성되면 가상머신은 다음의 형태로 메모리를 구성한다.


   공유-->

    메소드 영역

 <--공유

     스택 영역

     스택 영역

     스택 영역

   공유-->

      힙 영역

 <--공유


모든 쓰레드는 자신의 스택을 할당 받는다. 그러나 힙과 메소드 영역은 모든 쓰레드가 공유한다.

힙영역이 공유 된다는 것은 모든 쓰레드가 동일한 힙 영역에 접근이 가능함을 의미하는 것이고 이는

'A쓰레드가 만든 인스턴스의 참조값 만 알면 B쓰레드도 A쓰레드가 만든 인스턴스에 접근 가능하다.'는 뜻이다.




'Java' 카테고리의 다른 글

동기화 Synchronization  (0) 2017.02.26
쓰레드 Thread  (0) 2017.02.26
Map<K,V> 인터페이스  (0) 2017.02.26
배열 (Array) / forEach  (0) 2017.02.26
HashSet<E> / TreeSet<E>  (0) 2017.02.26

+ Recent posts