[java] 자바 스레드의 상태(State)와 전환

자바에서 멀티스레드 프로그래밍을 할 때, 스레드의 상태(State)와 이 상태들 간의 전환을 이해하는 것은 매우 중요합니다. 스레드의 상태는 스레드의 실행 단계를 나타내며, 상태 전환은 스레드가 다른 상태로 이동하는 것을 의미합니다.

스레드의 세 가지 주요 상태

자바에서는 Thread 클래스를 사용하여 스레드를 생성하고 관리합니다. 스레드는 다음 세 가지 주요 상태를 가집니다.

  1. New: 스레드 객체가 생성되었지만, 아직 start 메서드가 호출되지 않은 상태입니다. 이 상태에서는 아직 스레드가 실행되지 않습니다.
  2. Runnable: 스레드가 실행되기 위해 준비되어 있는 상태입니다. start 메서드가 호출되면 스레드는 Runnable 상태로 전환되고, 스레드 스케줄러에 의해 실행될 수 있습니다.
  3. Waiting: 스레드가 실행 중지되어 다른 스레드에 의해 깨어나기를 기다리는 상태입니다. 스레드가 sleep 메서드를 호출하거나 객체의 wait 메서드를 호출하여 대기 상태로 전환될 수 있습니다.

스레드 상태 전환

스레드의 상태 전환은 스레드 스케줄러(Scheduler)에 의해 관리됩니다. 스레드 스케줄러는 여러 스레드들 중에서 어떤 스레드가 실행될지를 결정합니다.

스레드의 상태 전환은 자동적으로 이루어지며, 프로그래머는 직접 제어하는 것이 아닙니다. 스레드가 상태 전환을 하기 위해서는 특정 조건을 충족해야 합니다. 예를 들어, Runnable 상태에 있는 스레드는 현재 실행 중인 스레드가 아닌 경우, 스레드 스케줄러에 의해 선택되어 실행될 수 있습니다.

스레드의 상태 전환 예시

다음은 스레드의 상태 전환 예시입니다.

public class ThreadExample extends Thread {
  
    @Override
    public void run() {
        try {
            // 스레드 실행 중지 1초 동안 대기
            Thread.sleep(1000);
            // 다른 스레드에 의해 실행될 때까지 대기
            synchronized (this) {
                wait();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  
    public static void main(String[] args) {
        ThreadExample thread = new ThreadExample();
        thread.start(); // 스레드 실행
    }
}

위의 예시에서, 스레드 객체인 threadstart 메서드를 호출하여 Runnable 상태로 전환됩니다. 그 후, 1초 동안 스레드가 실행되다가 sleep 메서드에 의해 Waiting 상태로 전환됩니다. 이후 wait 메서드에 의해 스레드는 대기 상태로 전환됩니다. 다른 스레드에 의해 해당 객체의 notifynotifyAll 메서드가 호출되어야 스레드가 다시 Runnable 상태로 전환됩니다.

결론

자바 스레드의 상태(State)와 이 상태들 간의 전환은 멀티스레드 프로그래밍에서 매우 중요한 요소입니다. 스레드의 상태를 이해하고, 상태 전환을 올바르게 사용하면 효율적인 멀티스레드 프로그램을 개발할 수 있습니다.