线程的状态

线程状态的分类

线程作为操作系统调度的基本单位,在被调度时也会有很多种状态;
线程一般分为以下几种:

状态

解释

NEW

安排了工作, 还未开始行动

RUNNABLE

可工作的. 又可以分成正在工作中和即将开始工作

BLOCKED

这几个都表示排队等着其他事情

WAITING

这几个都表示排队等着其他事情

TIMED_WAITING

这几个都表示排队等着其他事情

TERMINATED

工作完成了

其中WAITING,TIMED_WAITING,TERMINATED都属于阻塞(表示PCB都处于阻塞队列中),这几个状态是不同原因的阻塞

线程状态的转移

java 线程打印机 java打印线程状态_jvm

线程状态的打印

打印线程的状态用getState方法:

java 线程打印机 java打印线程状态_java 线程打印机_02


打印线程这行代码在调用start方法之前,所以此时操作系统内核并未创建PCB,所以线程的状态是NEW。

线程的切换

NEW和TERMINATED

NEW:表示创建了线程所需要执行的任务,但是还没有工作;
TERMINATED:表示线程已经执行完任务,PCB释放了
代码如下:

public class Test4 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            System.out.println("hello");
        });
        System.out.println(t.getState());
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(t.getState());
    }
}

java 线程打印机 java打印线程状态_java_03


第一次输出NEW,因为此时只是创建了线程实例,指明了线程所要执行的任务,当线程执行完(打印hello)任务后,再次调用getState方法之后输出则是TERMINATED.

RUNNABLE

RUNNABLE:可工作的. 又可以分成正在工作中和即将开始工作,表示此时有线程正在CPU上执行或者等待执行

public class Test4 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 1000000; i++) {

            }
        });
        System.out.println(t.getState());
        t.start();
        System.out.println(t.getState());
        try {
            t.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(t.getState());
    }
}

java 线程打印机 java打印线程状态_java_04


因为线程执行的任务是1000000不做任何操作,此时获取到线程的状态就是RUNNABLE.

TIMED_WAITING

TIMED_WAITING:表示这几个都表示排队等着其他事情,一般是因为线程在执行的时候进行了sleep操作;

public class Test3 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        System.out.println(t.getState());
        t.start();

        for (int i = 0; i < 100; i++) {
            System.out.println(t.getState());
        }

        try {
            t.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(t.getState());
    }

java 线程打印机 java打印线程状态_java_05


此时在输出NEW和TERMINATED之间分别输出了很多的RUNNABLE和TIMED_WAITING,因为当创建的线程在执行操作到sleep时,此时线程的状态就是TIMED_WAITING,当休眠结束线程继续执行时,此时线程的状态就是RUNNABLE.