线程的状态

x33g5p2x  于2021-11-25 转载在 其他  
字(1.0k)|赞(0)|评价(0)|浏览(509)

前言:
线程状态和进程状态是类似的,进程状态是辅助进程进行调度,线程状态是辅助线程进行调度

Java 中线程的状态是通过一个 enum 来表示的

线程的所有状态

线程的状态是一个枚举类型 Thread.State

public static void main(String[] args) {
    for (Thread.State state : Thread.State.values()){
        System.out.println(state);
    }
}

输出结果:

状态说明:

除了 NEW 和 TERMINATED 状态外,其他4个状态的 isAlive 结果都为 true
即,isAlive:判断内核中的线程是否存在

  • NEW: Thread 对象有了,内核中的线程(PCB)还没有 即:任务布置了,还没有开始执行
  • RUNNABLE: 就绪状态,表示当前线程正在CPU上执行,或者已经准备好随时上CPU,有一个专门的就绪队列来维护
  • 下边这三个均表示 阻塞状态,当前线程暂时停了下来,不会继续到CPU上执行,表示正在排队 等到时机成熟,才有机会执行
    BLOCKED: 等待锁导致
    WAITING: wait 方法导致
    TIMED_WAITING: sleep 方法导致
  • TERMINATED: 内核中的线程已经结束(PCB已经被销毁),但是代码中的 Thread 对象还在(这个对象得等GC来回收)

线程状态和状态转移的意义

上图:

yield( ):主动放权,表示,让当前线程放弃 CPU 的执行权限,重新在就绪队列中排队。这个操作相当于:sleep(0)

NEW,RUNNABLE,TERMINATED 状态的转换 示例:

  • 使用 isAlive 方法判定线程的存活状态
public static void main(String[] args) {
    Thread t = new Thread(){
        @Override
        public void run(){
            for (int i = 0; i < 1000_0000; i++) {
                
            }
        }
    };
    System.out.println("线程启动前: " + t.getState());
    t.start();
    while (t.isAlive()){
        System.out.println("线程正在运行中: " + t.getState());
    }
    System.out.println("线程结束后: " + t.getState());
}

输出结果:

截取前半部分,和后半部分…

后续在进行补充…

相关文章