앞서서 스레드의 상태에 대한 열거 상수 리스트까지 살펴보았습니다. 이제 이 내용을 바탕으로, 예제 코드를 작성해 보겠습니다.
아래의 스레드는 특정 타겟 스레드의 상태를 0.5초 주기로 출력하는 스레드입니다.
// StatePrintThread.java
// 타겟 스레드의 상태를 출력해주는 스레드
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();
}
// 종료 상태이면 while문 종료
if(state == Thread.State.TERMINATED) {
break;
}
try {
// 0.5초 간 일시 정지
Thread.sleep(500);
} catch(Exception e) {}
}
}
}
다음은 상태 출력의 대상이 되는 타겟 스레드입니다.
// TargetThread.java
public class TargetThread extends Thread {
public void run() {
// 10억번 루핑 돌며 RUNNABLE 상태를 유지하게 함
for(long i=0; i<1000000000; i++) {}
try {
// 1.5초간 일시 정지하며 TIMED_WAITING 상태를 유지
Thread.sleep(1500);
} catch(Exception e) {}
// 10억번 루핑 돌며 RUNNABLE 상태를 유지하게 함
for(long i=0; i<1000000000; i++) {}
}
}
다시 한번 복기해보자면, 해당 타겟 스레드가 start( )로 실행되면 실행 대기(RUNNABLE)이 되고, run( )을 실행하게 됩니다. 그리고 1.5초간 sleep( )으로 TIME_WAITING가 된 다음 다시 루프가 돌게 되는 구조입니다.
정리하면, 순서는
TargetThread의 객체 생성 [NEW] → for문 [RUNNABLE] → 1.5초간 sleep [TIME_WAITING] → for문 [RUNNABLE] → run( ) 종료 [TERMINATED]가 됩니다.
이제 실행 클래스를 통해 StatePrintThread를 생성하고, 파라미터로 전달 받은 TargetThread의 상태를 출력해 보겠습니다.
public class ExampleMain {
public static void main(String[] args) {
StatePrintThread statePrintThread = new StatePrintThread(new TargetThread());
statePrintThread.start();
}
}
/* 출력
타겟 스레드 상태: NEW
타겟 스레드 상태: TIMED_WAITING
타겟 스레드 상태: TIMED_WAITING
타겟 스레드 상태: RUNNABLE
타겟 스레드 상태: TERMINATED
*/
'Programming > JAVA' 카테고리의 다른 글
멀티 스레드(6) - 스레드 상태 제어 2 (1) | 2024.11.25 |
---|---|
멀티 스레드(6) - 스레드 상태 제어 1 (0) | 2024.11.24 |
멀티 스레드(5) - 스레드 상태 1 (0) | 2024.11.19 |
멀티 스레드(4) - 동기화 메서드와 동기화 블록 3 (0) | 2024.11.18 |
멀티 스레드(4) - 동기화 메서드와 동기화 블록 2 (3) | 2024.11.14 |