Ali Ermian: 스레드 수명 주기와 변환 프로세스에 대해 말씀해 주시겠습니까?

쓰레드의 생명주기는 쓰레드의 생성부터 소멸까지의 전 과정을 말하며, 일반적으로 쓰레드의 생명주기는 다음과 같이 5가지가 있다.

  • 초기 상태
  • 작동 상태
  • 운영 현황
  • 수면 상태
  • 종료 상태

상태 전환은 다음 다이어그램에 나와 있습니다.

자바 스레드 수명 주기

자바 쓰레드의 라이프 사이클은 위에서 언급한 라이프 사이클과 다른 6가지 상태를 갖는다.

  1. NEW(초기화 상태)
  2. RUNNABLE(실행 가능/실행 상태)
  3. BLOCKED(차단된 상태)
  4. WAITING(무제한 대기 상태)
  5. TIMED_WAITING(시간 지정 대기 상태)
  6. 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
 

추천

출처blog.csdn.net/wdjnb/article/details/123004081