운영 체제 수준에서 모든 스레드에는 일반적으로 생성, 준비, 실행 중, 차단 및 종료의 5가지 상태가 있습니다.
(1) 새 상태(NEW)
new Thread()와 같은 프로그램 내 구성 메소드를 사용하여 새 스레드가 생성되면 해당 스레드는 이미 생성 상태에 있습니다. 메모리 공간 및 기타 리소스가 있지만 아직 실행이 시작되지 않았습니다.
(2) 준비 상태(READ)
새로 생성된 스레드 개체의 start() 메서드를 호출하여 스레드를 시작할 수 있습니다. 스레드가 시작되면 스레드는 준비 상태(runnable)에 들어갑니다
스레드는 실행 조건이 있지만 아직 CPU가 할당되지 않았기 때문에 스레드 큐에 들어가서 CPU 서비스를 기다리기 위해 큐에 들어갑니다. 시스템이 실행할 스레드 개체를 선택하면 해당 개체는 대기 상태에서 실행 상태로 전환됩니다. 시스템이 선택한 작업을 "CPU 스케줄링"이라고 합니다. 스레드가 CPU를 획득하면 실행 상태로 들어가 자동으로 자체 실행 메서드를 실행합니다.
(3) 실행 상태(RUNNING)
준비 상태의 스레드가 호출되면 스레드는 실행 상태로 들어가 프로세서 자원을 점유합니다. 이때 스레드 객체의 run() 메서드가 자동으로 호출됩니다.
(4) 차단된 상태(BLOCKED)
실행 스레드는 인위적으로 일시 중단되거나 시간이 많이 걸리는 입력 및 출력 작업을 수행해야 하는 등 특정 특수 상황에서 CPU를 포기하고 실행을 일시적으로 일시 중지합니다. 차단 상태.
실행 상태에서 sleep(), suspens(), wait() 및 기타 메소드를 사용하면 스레드가 차단됩니다. 차단되면 스레드는 큐에 진입할 수 없으며, 차단 원인이 제거된 경우에만 스레드는 준비 상태로 진입한 후 준비 큐로 돌아가 대기하게 됩니다. 원래 중지된 위치에서 실행됩니다.
기억하세요: 막힌 부분이 제거되면 실행 상태가 아닌 준비 상태로 돌아갑니다.
(5) TERMINATED
스레드가 stop(), destroy() 또는 run()을 호출하고 실행을 완료하면 스레드는 터미널 상태가 됩니다. 데드 상태의 스레드는 계속 실행될 수 없습니다.
Java 스레드의 수명 주기는 6가지 상태로 나뉩니다. Thread 클래스에는 스레드 상태를 저장하고 가져오는 데 특별히 사용되는 인스턴스 속성과 인스턴스 메서드가 있습니다. 그 중 스레드 Thread 인스턴스 상태를 저장하는 데 사용되는 인스턴스 속성은 다음과 같습니다.
// 以整数的形式保存线程的状态 private volatile int threadStatus = 0; // 返回当前线程的状态,一个枚举类型值 public State getState() { return sun.misc.VM.toThreadState(threadStatus); }
Thread.State는 다음과 같이 Java 스레드의 6가지 상태를 나타내는 6개의 열거 상수를 정의하는 내부 열거 클래스입니다.
public enum State { // 新建状态 NEW, // 运行状态 RUNNABLE, /** * 阻塞状态 * Object.wait */ BLOCKED, /** * 等待状态 * Object.wait * Thread.join * LockSupport.park */ WAITING, /** * 限时等待状态 * Thread.sleep * Object.wait * Thread.join * LockSupport.parkUntil * LockSupport.parkNanos */ TIMED_WAITING, // 终止状态 TERMINATED; }
4개가 있습니다. 공통 상태는 NEW(새) 상태, RUNNABLE(실행 가능) 상태, TERMINATED(종료됨) 상태 및 TIMED_WAITING(시간 제한 대기) 상태입니다.
(1) NEW 상태
Java 소스 코드에서는 NEW 상태를 다음과 같이 설명합니다. 성공적으로 생성되었지만 start() 메서드를 호출하여 시작되지 않은 Thread 스레드 인스턴스는 NEW 상태입니다.
물론, Thread 스레드 인스턴스의 start() 메서드가 호출되면 해당 상태가 NEW 상태에서 RUNNABLE 상태로 변경된다고 해서 스레드가 즉시 CPU 타임 슬라이스를 획득하여 실행한다는 의미는 아닙니다. 중간에는 운영체제의 일련의 작업이 필요합니다.
(2) RUNNABLE 상태
Thread 인스턴스의 start() 메서드를 호출한 후 스레드가 CPU 타임 슬라이스를 획득하고 다음 단계에서 실행을 시작하면 JVM은 스레드의 run() 메서드를 비동기적으로 호출합니다. 비즈니스 코드를 실행합니다. 그렇다면 run() 메소드가 비동기적으로 호출되기 전에 JVM은 무엇을 했습니까? Java 스레드의 Thread 인스턴스의 start() 메소드가 호출되면 해당 운영 체제의 스레드는 실행 상태가 아닌 준비 상태로 들어가며, Java 스레드는 이러한 준비 상태를 가지지 않습니다. 운영 체제에서 스레드의 준비 상태는 무엇입니까? JVM의 스레드 상태와 이면의 운영 체제 스레드 상태 간의 변환 관계는 다음과 같이 단순화됩니다.
운영 체제 스레드가 준비 상태에 있으면 "모든 것이 준비되었으며, 필요한 것은 동풍뿐입니다." 즉, 스레드 실행 조건이 충족되었지만 아직 실행이 발생할 수 없습니다. 준비 상태의 스레드는 시스템의 스케줄링을 기다려야 하며, 시스템이 준비 상태를 선택하고 CPU 타임 슬라이스를 얻으면 스레드는 CPU를 점유하기 시작하고 이때 스레드의 코드를 실행하기 시작합니다. 스레드의 운영 체제 상태가 변경되고 실행 상태로 들어갑니다.
운영 체제에서 실행 중인 스레드가 CPU 타임 슬라이스를 모두 사용하면 준비 상태로 돌아가 다음 CPU 스케줄링을 기다립니다. 이런 방식으로 운영 체제 스레드는 준비 상태와 실행 상태 사이에서 시스템에 의해 반복적으로 예약됩니다. 이러한 상황은 스레드의 코드 논리 실행이 완료되거나 스레드가 비정상적으로 종료될 때까지 계속됩니다. 이때 스레드의 운영 체제 상태가 다시 변경되어 스레드의 최종 상태인 TERMINATED 상태로 들어갑니다.
준비 상태와 실행 상태는 모두 운영 체제의 스레드 상태입니다. Java 언어에서는 이 두 상태가 세분화되지 않고 동일한 상태인 RUNNABLE 상태로 병합됩니다. 따라서 Thread.State 열거 클래스에는 스레드의 준비 상태와 실행 상태가 정의되지 않고 RUNNABLE 상태만 정의됩니다. 이는 Java 스레드 상태가 운영 체제의 스레드 상태와 다른 점입니다.
Thread 인스턴스가 NEW 상태일 때 start() 메서드가 호출되면 스레드는 RUNNABLE 상태로 전환됩니다. 그럼에도 불구하고 스레드의 run() 메서드는 즉시 동시에 실행되지 않을 수 있습니다. 스레드가 CPU 타임 슬라이스를 얻은 후에 동시 실행을 시작해야 합니다.
(3) TERMINATED 상태
RUNNABLE 상태의 스레드가 run() 메서드 실행을 마치면 종료 상태 TERMINATED로 들어갑니다. 물론, run() 메소드 실행 중에 런타임 예외가 발생하고 이를 포착하지 못하면 run() 메소드가 비정상적으로 종료되고 스레드도 TERMINATED 상태가 된다.
(4) TIMED_WAITING 상태
스레드는 특수 대기 상태입니다. 정확히 말하면 시간 제한 대기 상태입니다. 스레드를 시간 제한 대기 상태로 전환할 수 있는 작업은 대략 다음과 같습니다.
Thread.sleep(int n): 현재 스레드를 시간 제한 대기 상태로 전환하고 대기 시간은 n입니다. 밀리초.
Object.wait(): 시간 제한이 있는 객체의 모니터 잠금을 선점합니다.
Thread.join(): 시간 제한이 있는 스레드 병합.
LockSupport.parkNanos(): 스레드를 기다리게 합니다. 시간은 나노초 단위입니다.
LockSupport.parkUntil(): 스레드를 기다리게 하면 시간을 유연하게 설정할 수 있습니다.
위 내용은 Java 스레드의 5가지 상태는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!