예제가 있는 Java 스레드 상태 소개 – 스레드의 수명 주기

게시 됨: 2019-01-11
예제와 함께 자바 스레드 상태 소개

스레드 상태

다음 다이어그램은 Java 스레드가 수명 중 임의의 시점에 있을 수 있는 다양한 상태와 다른 상태로의 전환을 유발하는 메소드 호출을 보여줍니다. 이 다이어그램은 완전한 유한 상태 다이어그램이 아니라 스레드 수명의 더 흥미롭고 일반적인 측면에 대한 개요입니다.

아래 질문 중 하나라도 있으면 올바른 위치에 있습니다.

  • Java에서 스레드의 수명 주기
  • Java에서 스레드의 수명 주기 및 상태
  • 자바 스레드 상태 이해하기

이 페이지의 나머지 부분에서는 상태 측면에서 Thread's life cycle 에 대해 설명합니다.

예제가 있는 Java 스레드 상태

새 스레드

다음 명령문은 새 스레드를 생성하지만 시작하지 않으므로 다이어그램에서 스레드를 New Thread 상태로 유지합니다.

쓰레드가 New Thread 상태에 있을 때, 그것은 단지 빈 Thread 객체일 뿐입니다. 아직 할당된 시스템 리소스가 없습니다. 따라서 스레드가 이 상태에 있을 때 스레드를 시작하거나 중지하는 것만 가능합니다. 스레드가 이 상태에 있을 때 start() 또는 stop() 이외의 다른 메서드를 호출하는 것은 의미가 없으며 IllegalThreadStateException이 발생합니다.

실행 가능

이제 다음 두 줄의 코드를 고려하십시오.

start() 메서드는 스레드를 실행하는 데 필요한 시스템 리소스를 만들고 스레드가 실행되도록 예약하고 스레드의 run() 메서드를 호출합니다. 이 시점에서 스레드는 "실행 가능" 상태에 있습니다. 이 상태는 스레드가 이 상태에 있을 때 실제로 실행되지 않을 수 있기 때문에 "실행 중"이 아니라 "실행 가능"이라고 합니다. 많은 컴퓨터에는 단일 프로세서가 있어 모든 "실행 가능한" 스레드를 동시에 실행할 수 없습니다.

따라서 Java 런타임 시스템은 모든 "실행 가능한" 스레드 간에 프로세서를 공유하는 스케줄링 체계를 구현해야 합니다. 그러나 대부분의 경우 "실행 가능" 상태를 단순히 "실행 중"으로 생각할 수 있습니다. 스레드가 실행 중일 때 "실행 가능"이고 현재 스레드인 경우 run() 의 명령이 순차적으로 실행됩니다.

실행할 수 없음

스레드는 다음 네 가지 이벤트 중 하나가 발생하면 Not Runnable 상태가 됩니다.

  • 누군가가 suspend() 메서드를 호출합니다.
  • 누군가 sleep() 메서드를 호출합니다.
  • 스레드는 wait() 메서드를 사용하여 조건 변수를 기다립니다.
  • 스레드가 I/O에서 차단되고 있습니다.

예를 들어, 이 코드 스니펫의 굵은 선은

myThread 를 10초(10,000밀리초) 동안 절전 모드로 전환합니다. 이 10초 동안 프로세서를 사용할 수 있게 myThread 는 실행되지 않습니다. 10초가 지나면 myThread 는 다시 "실행 가능"이 되고 이제 프로세서를 사용할 수 myThread 가 실행됩니다.

위에 나열된 "Not Runnable" 상태로 들어가는 "entrance" 각각에 대해 스레드를 "Runnable" 상태로 되돌리는 특정하고 고유한 탈출 경로가 있습니다. 탈출 경로는 해당 "입구"에 대해서만 작동합니다. 예를 들어, 스레드가 절전 모드로 전환된 경우 스레드가 다시 "실행 가능" 상태가 되기 전에 지정된 시간(밀리초)이 경과해야 합니다. 잠자는 스레드에서 resume() 을 호출해도 아무런 효과가 없습니다.

다음은 "Not Runnable" 상태로 진입하는 모든 입구의 탈출 경로를 나타냅니다.

  • 스레드가 휴면 상태가 된 경우 지정된 시간(밀리초)이 경과해야 합니다.
  • 스레드가 일시 중단된 경우 누군가가 resume() 메서드를 호출해야 합니다.
  • 스레드가 조건 변수를 기다리고 있는 경우 변수를 소유한 모든 객체는 notify notify() 또는 notifyAll() 을 호출하여 변수를 포기해야 합니다.
  • 스레드가 I/O에서 차단되면 지정된 I/O 명령이 완료되어야 합니다.
자바 스레드 튜토리얼

죽은

스레드는 두 가지 방법으로 죽을 수 있습니다. 자연적 원인 또는 종료(중지)입니다. 스레드는 run() 메서드가 정상적으로 종료되면 자연스럽게 죽습니다. 예를 들어, 이 방법의 while 루프는 유한 루프입니다. 100번 반복한 다음 종료됩니다.

run() 메서드를 사용하는 스레드는 루프와 run() 메서드가 완료된 후 자연스럽게 죽습니다.

또한 stop() 메서드를 호출하여 언제든지 스레드를 종료할 수도 있습니다. 이 코드 조각.

myThread 를 만들고 시작한 다음 현재 스레드를 10초 동안 절전 모드로 전환합니다. 현재 스레드가 깨어나면 코드 세그먼트의 굵은 줄이 myThread 를 종료합니다.

stop() 메서드는 스레드를 종료하기 위해 스레드에서 ThreadDeath 개체를 throw합니다. 따라서 이러한 방식으로 스레드가 종료되면 비동기식으로 종료됩니다. 스레드는 실제로 ThreadDeath 예외를 수신할 때 죽습니다.

불법 스레드 상태 예외

스레드에서 메서드를 호출하고 해당 스레드의 상태가 해당 메서드 호출을 허용하지 않는 경우 런타임 시스템은 IllegalThreadStateException을 발생시킵니다. 예를 들어, "Runnable"이 아닌 스레드에서 suspend() 를 호출하면 IllegalThreadStateException이 발생합니다.

지금까지의 다양한 스레드 예제에서 볼 수 있듯이 예외를 throw할 수 있는 스레드 메서드를 호출할 때 예외를 catch 및 처리하거나 호출 메서드가 catch되지 않은 예외를 throw한다고 선언해야 합니다.

isAlive() 메서드

그리고 스레드 상태에 대한 마지막 단어: Thread 클래스의 프로그래밍 인터페이스에는 isAlive() 라는 메서드가 포함되어 있습니다. isAlive() 는 스레드가 시작되고 중지되지 않은 경우 true를 반환합니다. 따라서 isAlive() 메서드가 false 를 반환하면 스레드가 "New Thread" 또는 "Dead"임을 알 수 있습니다.

isAlive() 메서드가 true 를 반환하면 스레드가 "실행 가능" 또는 "실행 불가능"임을 알 수 있습니다. "새 스레드"와 "죽은" 스레드를 구별할 수 없습니다. 또한 "실행 가능" 스레드와 "실행 불가능" 스레드를 구별할 수 없습니다.

복잡한 스레드 예제를 보면서 net에서 이 정말 훌륭한 튜토리얼을 찾았습니다. 모두가 이것을 주의 깊게 읽어야 합니다.