안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
스레드(Thread) 상태
스레드 객체를 생성하고 start() 메서드를 호출하면 실행 대기 상태가 됩니다.
실행 대기 상태 : 아직 스케줄링이 되지 않아서 실행을 기다리고 있는 상태
실행 상태 :실행 대기 상태에 있는 스레드 중에서
스레드 스케줄링으로 선택된 스레드가 비로소 CPU를 점유하고 run()메서드를 실행합니다.
실행 상태의 스레드는 run() 메서드를 모두 실행하기 전에
스레드 스케줄링에 의해 다시 실행 대기 상태로 돌아갈 수 있습니다.
실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 됩니다.
이처럼 스레드는 실행 대기 상태와 실행 상태를 번갈아가며 자신의 run() 메서드를 조금 씩 실행합니다.
종료 상태 : 실행 상태에서 run() 메서드가 종료되어 실행할 코드가 없어 스레드의 실행이 멈춘 상태
스레드는 실행 상태에서 실행 대기 상태로 가지 않을 수도 있습니다.
실행 상태에서 일시 정지 상태로 가기도 한다.
일시 정지 상태: 스레드가 실행할 수 없는 상태
일시 정지 상태는 WAITING, TIMED_WAITING, BLOCKED 가 있습니다.
getState() 메서드는 아래 표처럼 스레드 상태에 따라 Thread.State 열거 상수를 리턴합니다.
상태 열거 상수 설명
객체 생성 NEW 스레드 객체가 생성, 아직 start() 메서드가 호출되지 않은 상태
실행 대기 RUNNABLE 실행 상태로 언제든지 갈 수 있는 상태
일시 정지 WAITING 다른 스레드가 통지할 때까지 기다리는 상태
TIMED_WAITING 주어진 시간 동안 기다리는 상태
BLOCKED 사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태
종료 TERMINATED 실행을 마친 상태
예제를 보겠습니다.
타겟 스레드의 상태를 출력하는 스레드
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) {
break; 종료 상태일 경우 while문을 종료
}
try {
//0.5초간 일시 정지듬
Thread.sleep(500);
} catch(Exception e) {}
}
}
}
타겟 스레드
public class TargetThread extends Thread {
public void run() {
for(long i=0; i<1000000000; i++) {}
try {
//1.5초간 일시 정지
Thread.sleep(1500);
} catch(Exception e) {}
for(long i=0; i<1000000000; i++) {}
}
}
실행 클래스
public class ThreadStateExample {
public static void main(String[] args) {
StatePrintThread statePrintThread = new StatePrintThread(new TargetThread());
statePrintThread.start();
}
}
=========================================================================================
스레드 상태 제어
음악 재생 플레이어에서 음악을 듣다가 일시 정지시키거나, 종료시킬 수 있습니다.
일시 정지는 잠시 후 다시 음악을 듣겠다는 의미이므로
음악 재생 플레이어 스레드를 일시 정지 상태로 만들어야 합니다.
그리고 종료는 더 이상 음악을 듣지 않겠다는 뜻이므로 음악 재생 플레이어는
스레드를 종료 상태로 만들어야 합니다.
이처럼 실행 중인 스레드의 상태를 변경하는 것을 스레드 상태 제어라고 합니다.