컴퓨터 & 코딩/Java

[혼공학습단 10기][혼공자] 스레드 제어

구로그 2023. 7. 18. 14:06
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이 발생한다. 

 

 

 

반응형