쓰레드의 생명주기는 쓰레드의 생성부터 소멸까지의 전 과정을 말하며, 일반적으로 쓰레드의 생명주기는 다음과 같이 5가지가 있다.
- 초기 상태
- 작동 상태
- 운영 현황
- 수면 상태
- 종료 상태
상태 전환은 다음 다이어그램에 나와 있습니다.
자바 스레드 수명 주기
자바 쓰레드의 라이프 사이클은 위에서 언급한 라이프 사이클과 다른 6가지 상태를 갖는다.
- NEW(초기화 상태)
- RUNNABLE(실행 가능/실행 상태)
- BLOCKED(차단된 상태)
- WAITING(무제한 대기 상태)
- TIMED_WAITING(시간 지정 대기 상태)
- TERMINATED(종료된 상태)
다음과 같이 Thread의 소스 코드에서 이러한 6가지 상태를 찾을 수 있습니다.
물론 다음 코드와 같이 Java 코드를 사용하여 모든 스레드 상태를 인쇄할 수도 있습니다.
for (Thread.State value : Thread.State.values()) {
System.out.println(value);
}
复制代码
위 프로그램의 실행 결과는 다음 그림과 같다.
수명 주기 전환
다음으로 자바 쓰레드 라이프 사이클의 변환 과정에 대해 이야기해보자.
1. 신규에서 RUNNABLE로
스레드, 즉 새로운 스레드를 생성할 때 스레드는 다음 코드와 같이 NEW 상태가 됩니다.
// 创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// ...
}
});
// 获取线程状态
Thread.State state = thread.getState();
System.out.println(state);
复制代码
위 프로그램의 실행 결과는 다음 그림과 같다.
그러나 스레드의 시작 메서드를 호출한 후 스레드의 상태는 다음 코드와 같이 NEW 에서 RUNNABLE 로 변경됩니다.
// 创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 获取到当前执行的线程
Thread currThread = Thread.currentThread();
// 获取线程状态
Thread.State state = currThread.getState();
// 打印线程状态
System.out.println(state);
}
});
thread.start();
复制代码
위 프로그램의 실행 결과는 다음 그림과 같다.
2. RUNNABLE에서 BLOCKED로
스레드의 코드가 동기화 실행을 위해 큐에 대기되면 스레드는 다음 코드와 같이 RUNNABLE 상태에서 BLOCKED 차단 상태로 변경됩니다.
// 创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
// 等待 100 毫秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("排队使用锁");
synchronized (ThreadStates.class) {
}
}
});
thread.start();
// 让主线程先得到锁
synchronized (ThreadStates.class) {
// 获取线程状态
Thread.State state = thread.getState();
// 打印线程状态
System.out.println("首次获取线程状态:" + state);
// 休眠 1s
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 再次获取线程状态
state = thread.getState();
// 打印线程状态
System.out.println("第二次获取线程状态:" + state);
}
复制代码
위 프로그램의 실행 결과는 다음 그림과 같다.
스레드가 동기화된 잠금을 획득하면 BLOCKED 상태에서 RUNNABLE 상태로 전환됩니다.
3. RUNNABLE에서 WAITTING으로
스레드가 wait() 메서드를 호출한 후 다음과 같이 RUNNABLE 상태에서 WAITING 무한 대기 상태로 변경됩니다.
// 创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
try {
// 线程休眠
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
// 启动线程
thread.start();
// 获取线程状态
Thread.State state = thread.getState();
// 打印线程状态
System.out.println("首次获取线程状态:" + state);
// 休眠 1s
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 获取线程状态
state = thread.getState();
// 打印线程状态
System.out.println("第二次获取线程状态:" + state);
复制代码
위 프로그램의 실행 결과는 다음 그림과 같다.
notify/notifyAll 메서드가 호출되면 스레드는 다음 코드와 같이 WAITING 상태에서 RUNNABLE 상태로 변경됩니다.
Object lock = new Object();
// 创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
try {
// 线程休眠
lock.wait();
// 获取当前线程状态
Thread.State state = Thread.currentThread().getState();
// 打印线程状态
System.out.println("获取线程状态:" + state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
// 启动线程
thread.start();
// 获取线程状态
Thread.State state = thread.getState();
// 打印线程状态
System.out.println("首次获取线程状态:" + state);
// 休眠 1s
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 获取线程状态
state = thread.getState();
// 打印线程状态
System.out.println("第二次获取线程状态:" + state);
// 唤醒 thread 线程
synchronized (lock) {
lock.notify();
}
复制代码
위 프로그램의 실행 결과는 다음 그림과 같다.
4. RUNNABLE에서 TIMED_WATTING까지
sleep(xxx)과 같은 시간 초과가 있는 대기 메서드를 호출하면 다음 코드와 같이 스레드가 RUNNABLE 상태에서 TIMED_WAITING 상태로 변경됩니다.
// 创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 启动线程
thread.start();
// 获取线程状态
Thread.State state = thread.getState();
// 打印线程状态
System.out.println("首次获取线程状态:" + state);
// 休眠 1s
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 获取线程状态
state = thread.getState();
// 打印线程状态
System.out.println("第二次获取线程状态:" + state);
复制代码
위 프로그램의 실행 결과는 다음 그림과 같다.
타임아웃 시간이 초과되면 스레드는 TIMED_WAITING 상태에서 RUNNABLE 상태로 변경되며 구현 코드는 다음과 같습니다.
// 创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
// 获取当前线程状态
Thread.State state = Thread.currentThread().getState();
// 打印线程状态
System.out.println("获取线程状态:" + state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 启动线程
thread.start();
// 获取线程状态
Thread.State state = thread.getState();
// 打印线程状态
System.out.println("首次获取线程状态:" + state);
// 休眠 1s
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 获取线程状态
state = thread.getState();
// 打印线程状态
System.out.println("第二次获取线程状态:" + state);
复制代码
위 프로그램의 실행 결과는 다음 그림과 같다.
5.RUNNABLE 到 종료
스레드가 실행된 후 다음 코드와 같이 RUNNABLE 상태에서 TERMINATED 소멸 상태로 변경됩니다.
// 创建线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 获取当前线程状态
Thread.State state = Thread.currentThread().getState();
// 打印线程状态
System.out.println("获取线程状态:" + state);
}
});
// 启动线程
thread.start();
// 等待 100ms,待线程执行完
Thread.sleep(100);
// 获取线程状态
Thread.State state = thread.getState();
// 打印线程状态
System.out.println("线程状态:" + state);
复制代码
위 프로그램의 실행 결과는 다음 그림과 같다.
요약하다
Java에는 6가지 스레드 수명 주기가 있습니다. NEW(초기화 상태), RUNNABLE(실행 가능/실행 상태), BLOCKED(차단 상태), WAITING(무제한 대기 상태), TIMED_WAITING(시간 지정 대기 상태), TERMINATED(종료) 상태). 스레드 수명 주기의 변환 프로세스는 다음 그림과 같습니다.
원본 링크: https://juejin.cn/post/7065856076737937438