728x90
❗️start() 메소드를 호출 하면 바로 실행되는 게 아니라 실행 대기 상태가 됨
운영체제는 실행 대기 상태에 있는 스레드 중 하나를 선택하여 실행 상태로 만듦
스레드 상태
- 실행 대기 상태 ↔︎ 실행 상태
- 실행 상태 → 일시 정지 상태
- 일시 정지 상태 → 실행 대기 상태
✏️ 스레드 상태 영어 표기
실행 대기 상태: Runnable
실행상태: Running
실행이 멈춘 상태: Terminated
스레드 상태 제어
실행중인 스레드의 상태를 변경한다. 이때 상태 변화를 가져오는 메소드를 파악해야 한다.
- interrupt() : 일시 정지 상태의 스레드에서 InterruptedException을 발생시켜 예외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다
- sleep(long millis): 주어진 시간 동안 스레드가 일시 정지 되고 주어진 시간이 지나면 자동적으로 실행 대기 상태가 된다.
stop(): 스레드를 즉시 종료시킨다 (이제 사용되지 않음)
✏️ 주어진 시간 동안 일시 정지: sleep()
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// interrupt() 메소드가 호출되면 실행
}
✏️ 스레드의 안전한 종료: stop 플래그와 interrupt()
1️⃣ stop 플래그를 이용
private boolean stop; // stop 플래그 필드
public void run() {
while( !stop ) {
// 스레드가 반복 실행하는 코드;
}
// 스레드가 사용한 자원 정리
}
2️⃣ interrupt() 메소드를 이용
ThreadB threadB = new TreadB();
threadB.start();
...
threadB.interrupt();
// ThreadB
public void run() {
try {
while(true) {
...
Thread.sleep(1);
}
} catch(InterruptedException e) {
}
}
다음과 같이 일시 정지를 만들지 않고도 interrupt()의 호출 여부를 알 수 있다.
boolean status = Thread.interrupted();
boolean status = objThread.isInterrupted();
public void run() {
while(true) {
...
if(Thread.interrupted() {
break;
}
}
}
데몬 스레드 daemon thread
- 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드.
- 주 스레드가 종료되면 데몬 스레드는 강제 종료 됨.
- 예: 워드 프로세서의 자동 저장, 미디어 플레이어의 동영상 및 음악 재생, 쓰레기 수집기 등. 여기서 주 스레드는 각각 워드 프로세서, 미디어 플레이어, JVM이 해당된다)
- isDaemon(): 현재 실행중인 스레드가 데몬 스레드인지 아닌지 확인하는 메소드
✏️ 스레드를 데몬으로 만들기
주 스레드가 데몬이 될 스레드의 setDaemon(true)을 호출해 주면 됨.
public static void main(String[] args) {
AutoSaveThread thread = new AutoSaveThread();
thread.setDaemon(true);
thread.start();
...
}
❗️반드시 start() 호출 전에 setDaemon(true)를 호출해야 한다. 안 그러면 IllegalThreadStateException이 발생한다.
반응형
'컴퓨터 & 코딩 > Java' 카테고리의 다른 글
[혼공학습단 10기][혼공자] 입출력 스트림 (0) | 2023.07.22 |
---|---|
[혼공학습단 10기][혼공자] 컬렉션 프레임워크 (0) | 2023.07.20 |
[혼공학습단 10기][혼공자] 4주차 미션 (0) | 2023.07.17 |
[혼공학습단 10기][혼공자] 멀티 스레드 (0) | 2023.07.17 |
[혼공학습단 10기][혼공자] 기본 API 클래스 (0) | 2023.07.13 |