logo

Java의 스레드 수명 주기 및 상태

에이 Java에서는 언제든지 다음 상태 중 하나로 존재할 수 있습니다. 스레드는 언제든지 표시된 상태 중 하나에만 있습니다.

  1. 새로운 상태
  2. 실행 가능 상태
  3. 차단된 상태
  4. 대기 상태
  5. 시간 제한 대기 상태
  6. 종료된 상태

아래 다이어그램은 특정 순간의 스레드의 다양한 상태를 나타냅니다.

Java의 스레드 수명 주기 및 상태' title=




스레드의 수명주기 

아래에 언급된 것처럼 수명 주기에는 스레드의 여러 상태가 있습니다.

  1. 새 스레드: 새 스레드가 생성되면 스레드는 다음 위치에 있습니다. 새로운 상태 . 스레드가 이 상태에 있을 때 스레드는 아직 실행을 시작하지 않았습니다. 스레드가 새 상태에 있으면 해당 코드는 아직 실행되지 않았으며 실행이 시작되지 않았습니다.
  2. 실행 가능 상태 : 스레드 달릴 준비가 됐어 실행 가능한 상태로 전환됩니다. 이 상태에서는 스레드가 실제로 실행 중이거나 언제든지 실행할 준비가 되어 있을 수 있습니다. 스레드에 실행할 시간을 제공하는 것은 스레드 스케줄러의 책임입니다. 다중 스레드 프로그램은 각 개별 스레드에 고정된 시간을 할당합니다. 각각의 스레드는 실행하는 데 약간의 시간이 걸립니다. 스레드는 잠시 동안 실행된 후 일시 중지되고 다른 스레드가 실행될 수 있도록 CPU를 포기합니다.
  3. 막힌: 스레드가 차단된 상태가 됩니다. 잠금을 획득하려고 할 때 그러나 현재 다른 스레드가 잠금을 획득했습니다. 스레드는 잠금을 획득하면 차단 상태에서 실행 가능 상태로 이동합니다.
  4. 대기상태 : 스레드가 대기 상태에 있습니다. wait()를 호출할 때 방법이나 가입하다() 방법. 다른 스레드가 이를 알리거나 해당 스레드가 종료되면 실행 가능 상태로 이동합니다.
  5. 시간 초과 대기 : 스레드가 시간 제한 대기 상태에 있는 경우 시간 제한 매개변수를 사용하여 메서드를 호출합니다. . 스레드는 시간 초과가 완료되거나 알림이 수신될 때까지 이 상태에 있습니다. 예를 들어 스레드가 절전 모드 또는 조건부 대기를 호출하면 시간 제한 대기 상태로 이동됩니다.
  6. 종료된 상태: 다음 이유 중 하나로 인해 스레드가 종료됩니다. 
    • 정상적으로 종료되기 때문입니다. 이는 스레드의 코드가 프로그램에 의해 완전히 실행되었을 때 발생합니다.
    • 분할 오류나 처리되지 않은 예외와 같은 비정상적인 오류 이벤트가 발생했기 때문입니다.

Java의 스레드 상태

Java에서 스레드 사용의 현재 상태를 얻으려면 Thread.getState() 스레드의 현재 상태를 가져오는 메서드입니다. 자바가 제공하는 java.lang.Thread.State 스레드 상태에 대한 ENUM 상수를 정의하는 열거형은 아래에 요약되어 있습니다. 

1. 새로운 

아직 시작되지 않은 스레드의 스레드 상태입니다. 

무작위 순서 SQL

공개 정적 최종 Thread.State NEW

2. 실행 가능 

실행 가능한 스레드의 스레드 상태입니다. 실행 가능 상태의 스레드는 JVM(Java Virtual Machine)에서 실행 중이지만 프로세서와 같은 운영 체제의 다른 자원을 기다리고 있을 수 있습니다. 

공개 정적 최종 Thread.State RUNNABLE

3. 차단됨 

모니터 잠금을 기다리는 동안 차단된 스레드의 스레드 상태입니다. 차단된 상태의 스레드는 모니터 잠금이 동기화된 블록/메서드에 들어가거나 호출 후 동기화된 블록/메서드에 다시 들어가기를 기다리고 있습니다. Object.wait(). 

공개 정적 최종 Thread.State BLOCKED

4. 대기 중 

 대기 중인 스레드의 스레드 상태입니다. 다음 메소드 중 하나를 호출하여 스레드가 대기 상태에 있습니다. 

  • 시간 초과 없이 Object.wait
  • 스레드.조인 시간 초과 없이
  • LockSupport.park

공개 정적 최종 Thread.State 대기 중

5. 시간 초과 대기 

지정된 대기 시간이 있는 대기 스레드의 스레드 상태입니다. 지정된 긍정적인 대기 시간으로 다음 메서드 중 하나를 호출하여 스레드가 시간 제한 대기 상태에 있습니다. 

  • 스레드.수면
  • 시간 초과로 Object.wait
  • 시간 초과가 있는 Thread.join
  • LockSupport.parkNanos
  • LockSupport.parkUntil

공개 정적 최종 Thread.State TIMED_WAITING

인터넷의 단점

6. 종료됨 

종료된 스레드의 스레드 상태입니다. 스레드의 실행이 완료되었습니다. 

공개 정적 최종 Thread.State 종료됨


스레드 상태 시연의 예

다음은 다양한 스레드 상태를 보여주는 티켓 예약 시스템의 실제 예입니다.

예:

Java
// Java program to demonstrate thread states  // using a ticket booking scenario class TicketBooking implements Runnable {  @Override  public void run() {    try {    // Timed waiting  Thread.sleep(200);   } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println('State of bookingThread while mainThread is waiting: ' +  TicketSystem.mainThread.getState());  try {    // Another timed waiting  Thread.sleep(100);   } catch (InterruptedException e) {  e.printStackTrace();  }  } } public class TicketSystem implements Runnable {  public static Thread mainThread;  public static TicketSystem ticketSystem;  @Override  public void run() {  TicketBooking booking = new TicketBooking();  Thread bookingThread = new Thread(booking);  System.out.println('State after creating bookingThread: ' + bookingThread.getState());  bookingThread.start();  System.out.println('State after starting bookingThread: ' + bookingThread.getState());  try {  Thread.sleep(100);  } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println('State after sleeping bookingThread: ' + bookingThread.getState());  try {    // Moves mainThread to waiting state  bookingThread.join();   } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println('State after bookingThread finishes: ' + bookingThread.getState());  }  public static void main(String[] args) {  ticketSystem = new TicketSystem();  mainThread = new Thread(ticketSystem);  System.out.println('State after creating mainThread: ' + mainThread.getState());  mainThread.start();  System.out.println('State after starting mainThread: ' + mainThread.getState());  } } 


자바 익명 함수

산출:

산출' loading='lazy' title=


설명:

  • 새 스레드가 생성되면 해당 스레드는 NEW 상태가 됩니다. 스레드에서 start() 메서드가 호출되면 스레드 스케줄러는 이를 Runnable 상태로 이동합니다.
  • 스레드 인스턴스에서 Join() 메서드가 호출될 때마다 메인 스레드는 예약 스레드가 완료되기를 기다리는 중 상태로 전환됩니다.
  • 스레드의 실행 메소드가 완료되면 해당 상태는 Terminating이 됩니다.
퀴즈 만들기