chapter12. 멀티 스레드. 


12.5 스레드 상태

// 스레드 객체를 생성하고, start() 메소드를 호출하면 곧바로 스레드가 실행되는 것처럼 보이지만, 사실은 실행 대기 상태가 된다.

// 실행 대기 상태란 아직 스케줄링이 되지 않아서 실행을 기다리고 있는 상태를 말한다.

// 실행 대기 상태에 있는 스레드 중에서 스레드 스케줄링으로 선택된 스레드가 비로서 CPU를 점유하고 run() 메소드를 실행한다.

// 이때를 실행(Running) 상태라고 한다.

// 실행 상태의 스레드는 run() 메소드를 모두 실행하기 전에 스레드 스케줄링에 의해 다시 실행 대기 상태로 돌아갈 수 있다.

// 그리고 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 된다.

// 이렇게 실행 대기 상태와 실행 상태를 번갈아가면서 자신의 run() 메소드를 조금씩 실행한다.




// getState() 메소드는 스레드 상태에 따라 다음 열거 상수를 리턴한다.



타겟 스레드의 상태를 출력하는 스레드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package sec05.exam01_state;
 
public class StatePrintThread extends Thread {    
    private Thread targetThread;
 
    public StatePrintThread(Thread targetThread) {
        this.targetThread = targetThread;
    }
 
    public void run() {
        while(true) {
            Thread.State state = targetThread.getState(); // 스레드의 상태 얻기
            System.out.println("타겟 스레드 상태: " + state);
            if(state == Thread.State.NEW) { // 객체 생성 상태일 경우, 실행 대기 상태로 만듬
                targetThread.start();
            }
            if(state == Thread.State.TERMINATED) { // 종료 상태일 경우, while문을 종료함
                break;
            }
            try {
                //0.5초간 일시 정지
                Thread.sleep(500);
            } catch(Exception e) {}
        }
    }
}
cs


타겟 스레드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package sec05.exam01_state;
 
public class TargetThread extends Thread {    
    public void run() {
        for(long i=0; i<1000000000; i++) {}
        
        try {
            //1.5초간 일시 정지 (TIMED_WAITING)
            Thread.sleep(1500);
        } catch(Exception e) {}
        
        for(long i=0; i<1000000000; i++) {}
    }
}
cs



실행 클래스

1
2
3
4
5
6
7
8
package sec05.exam01_state;
 
public class ThreadStateExample {
    public static void main(String[] args) {
        StatePrintThread statePrintThread = new StatePrintThread(new TargetThread());
        statePrintThread.start();
    }
}
cs






Posted by 너래쟁이
: