logo

스레드의 수명 주기(스레드 상태)

Java에서 스레드는 항상 다음 상태 중 하나로 존재합니다. 이러한 상태는 다음과 같습니다.

  1. 새로운
  2. 활동적인
  3. 차단됨/대기 중
  4. 시간 초과 대기
  5. 종료됨

다양한 스레드 상태에 대한 설명

새로운: 새 스레드가 생성될 때마다 항상 새 상태에 있습니다. 새 상태의 스레드의 경우 코드가 아직 실행되지 않았으므로 실행이 시작되지 않았습니다.

활동적인: 스레드가 start() 메서드를 호출하면 새 상태에서 활성 상태로 이동합니다. 활성 상태에는 두 가지 상태가 포함됩니다. 하나는 실행 가능 , 그리고 다른 하나는 달리기 .

    실행 가능:실행 준비가 완료된 스레드는 실행 가능 상태로 이동됩니다. 실행 가능 상태에서는 스레드가 실행 중이거나 특정 순간에 실행할 준비가 되어 있을 수 있습니다. 실행할 스레드 시간을 제공하는 것, 즉 스레드를 실행 상태로 이동시키는 것은 스레드 스케줄러의 임무입니다.
    멀티스레딩을 구현하는 프로그램은 각 개별 스레드에 대해 고정된 시간 조각을 얻습니다. 각각의 모든 스레드는 짧은 시간 동안 실행되며 할당된 시간 조각이 끝나면 스레드는 자발적으로 다른 스레드에 CPU를 포기하므로 ​​다른 스레드도 해당 시간 조각 동안 실행될 수 있습니다. 이러한 시나리오가 발생할 때마다 실행하려는 모든 스레드는 실행 차례를 기다리고 실행 가능 상태에 있습니다. 실행 가능 상태에는 스레드가 있는 큐가 있습니다.달리기:스레드가 CPU를 얻으면 실행 가능 상태에서 실행 상태로 이동합니다. 일반적으로 스레드 상태의 가장 일반적인 변경은 실행 가능에서 실행 중으로, 그리고 다시 실행 가능으로 돌아가는 것입니다.

차단 또는 대기 중: 스레드가 일정 시간 동안(영구적이지 않음) 비활성 상태일 때마다 스레드는 차단 상태이거나 대기 상태에 있습니다.

예를 들어, 스레드(이름이 A라고 가정)가 프린터에서 일부 데이터를 인쇄하려고 할 수 있습니다. 그러나 동시에 다른 스레드(이름이 B라고 가정)는 프린터를 사용하여 일부 데이터를 인쇄하고 있습니다. 따라서 스레드 A는 스레드 B가 프린터를 사용할 때까지 기다려야 합니다. 따라서 스레드 A는 차단된 상태에 있습니다. 차단된 상태의 스레드는 실행을 수행할 수 없으므로 중앙 처리 장치(CPU)의 사이클을 전혀 소비하지 않습니다. 따라서 스레드 스케줄러가 대기 중이거나 차단된 상태에 있는 스레드 A를 다시 활성화할 때까지 스레드 A가 유휴 상태로 유지된다고 말할 수 있습니다.

메인 스레드가 Join() 메서드를 호출하면 메인 스레드가 대기 상태에 있다고 말합니다. 그러면 메인 스레드는 하위 스레드가 작업을 완료할 때까지 기다립니다. 하위 스레드가 작업을 완료하면 알림이 기본 스레드로 전송되어 스레드가 다시 대기 상태에서 활성 상태로 이동합니다.

대기 중이거나 차단된 상태에 있는 스레드가 많은 경우 어떤 스레드를 선택할지, 어떤 스레드를 거부할지 결정하는 것은 스레드 스케줄러의 임무이며 선택한 스레드에는 실행 기회가 제공됩니다.

시간에 따른 대기: 때로는 기다리다 보면 굶어 죽기도 합니다. 예를 들어, 스레드(이름은 A)가 코드의 임계 섹션에 들어갔고 해당 임계 섹션을 떠나려고 하지 않습니다. 이러한 시나리오에서는 다른 스레드(이름은 B)가 영원히 기다려야 하므로 기아 상태가 발생합니다. 이러한 시나리오를 피하기 위해 스레드 B에 시간 제한 대기 상태가 제공됩니다. 따라서 스레드는 영원히가 아닌 특정 시간 동안 대기 상태에 있습니다. 시간 초과 대기의 실제 예는 특정 스레드에서 sleep() 메서드를 호출하는 경우입니다. sleep() 메소드는 스레드를 시간 제한 대기 상태로 설정합니다. 시간이 지나면 스레드가 깨어나서 이전에 떠난 시점부터 실행을 시작합니다.

종료됨: 스레드는 다음과 같은 이유로 종료 상태에 도달합니다.

  • 스레드가 작업을 마치면 정상적으로 존재하거나 종료됩니다.
  • 비정상 종료:처리되지 않은 예외나 분할 오류와 같은 비정상적인 이벤트가 발생할 때 발생합니다.

종료된 스레드는 스레드가 더 이상 시스템에 없음을 의미합니다. 즉, 스레드가 종료되었으며 죽은 스레드를 다시 생성(종료 후 활성화)할 수 있는 방법이 없습니다.

다음 다이어그램은 스레드의 수명 주기와 관련된 다양한 상태를 보여줍니다.

Java 스레드 수명 주기

스레드 상태 구현

Java에서는 다음을 사용하여 스레드의 현재 상태를 얻을 수 있습니다. Thread.getState() 방법. 그만큼 java.lang.Thread.State Java 클래스는 스레드의 상태를 나타내는 상수 ENUM을 제공합니다. 이러한 상수는 다음과 같습니다.

지도를 찢다
 public static final Thread.State NEW 

NEW 상태인 스레드의 첫 번째 상태를 나타냅니다.

 public static final Thread.State RUNNABLE 

실행 가능한 상태를 나타냅니다. 스레드가 대기열에서 실행을 기다리고 있음을 의미합니다.

 public static final Thread.State BLOCKED 

차단된 상태를 나타냅니다. 이 상태에서 스레드는 잠금을 획득하기 위해 대기 중입니다.

 public static final Thread.State WAITING 

대기상태를 나타냅니다. 스레드는 시간 제한 없이 Object.wait() 메서드 또는 Thread.join() 메서드를 호출할 때 이 상태로 전환됩니다. 대기 상태의 스레드는 다른 스레드가 작업을 완료하기를 기다리고 있습니다.

 public static final Thread.State TIMED_WAITING 

시간이 초과된 대기 상태를 나타냅니다. 대기와 시간 제한 대기의 주요 차이점은 시간 제약입니다. 대기에는 시간 제약이 없지만 시간 제한 대기에는 시간 제약이 있습니다. 다음 메소드를 호출하는 스레드는 시간 제한 대기 상태에 도달합니다.

  • 시간 초과로 참여
  • 시간 초과로 기다리다
  • 공원까지
  • 파크나노스
 public static final Thread.State TERMINATED 

종료되거나 종료된 스레드의 최종 상태를 나타냅니다. 종료된 스레드는 실행이 완료되었음을 의미합니다.

스레드 상태를 보여주기 위한 Java 프로그램

다음 Java 프로그램은 위에 정의된 스레드의 일부 상태를 보여줍니다.

파일 이름: ThreadState.java

 // ABC class implements the interface Runnable class ABC implements Runnable { public void run() { // try-catch block try { // moving thread t2 to the state timed waiting Thread.sleep(100); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t1 while it invoked the method join() on thread t2 -'+ ThreadState.t1.getState()); // try-catch block try { Thread.sleep(200); } catch (InterruptedException ie) { ie.printStackTrace(); } } } // ThreadState class implements the interface Runnable public class ThreadState implements Runnable { public static Thread t1; public static ThreadState obj; // main method public static void main(String argvs[]) { // creating an object of the class ThreadState obj = new ThreadState(); t1 = new Thread(obj); // thread t1 is spawned // The thread t1 is currently in the NEW state. System.out.println('The state of thread t1 after spawning it - ' + t1.getState()); // invoking the start() method on // the thread t1 t1.start(); // thread t1 is moved to the Runnable state System.out.println('The state of thread t1 after invoking the method start() on it - ' + t1.getState()); } public void run() { ABC myObj = new ABC(); Thread t2 = new Thread(myObj); // thread t2 is created and is currently in the NEW state. System.out.println('The state of thread t2 after spawning it - '+ t2.getState()); t2.start(); // thread t2 is moved to the runnable state System.out.println('the state of thread t2 after calling the method start() on it - ' + t2.getState()); // try-catch block for the smooth flow of the program try { // moving the thread t1 to the state timed waiting Thread.sleep(200); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t2 after invoking the method sleep() on it - '+ t2.getState() ); // try-catch block for the smooth flow of the program try { // waiting for thread t2 to complete its execution t2.join(); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t2 when it has completed it's execution - ' + t2.getState()); } } 

산출:

 The state of thread t1 after spawning it - NEW The state of thread t1 after invoking the method start() on it - RUNNABLE The state of thread t2 after spawning it - NEW the state of thread t2 after calling the method start() on it - RUNNABLE The state of thread t1 while it invoked the method join() on thread t2 -TIMED_WAITING The state of thread t2 after invoking the method sleep() on it - TIMED_WAITING The state of thread t2 when it has completed it's execution - TERMINATED 

설명: 새 스레드를 생성할 때마다 해당 스레드는 새 상태를 얻습니다. 스레드에서 start() 메서드가 호출되면 스레드 스케줄러는 해당 스레드를 실행 가능 상태로 이동합니다. 스레드 인스턴스에서 Join() 메서드가 호출될 때마다 해당 명령문을 실행하는 현재 스레드는 이 스레드가 실행을 마칠 때까지 기다려야 합니다. 즉, 해당 스레드를 종료된 상태로 이동해야 합니다. 따라서 최종 print 문이 콘솔에 인쇄되기 전에 프로그램은 스레드 t2에서 Join() 메서드를 호출하여 스레드 t2가 실행을 완료하는 동안 스레드 t1을 기다리게 하여 스레드 t2가 종료되거나 데드 상태가 됩니다. . 스레드 t1은 스레드 t2에서 Join() 메소드를 호출하여 스레드 t2의 실행이 완료되기를 기다리고 있기 때문에 대기 상태로 전환됩니다.