Java线程的六种状态

Posted XeonYu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程的六种状态相关的知识,希望对你有一定的参考价值。

上一篇: 线程的基本使用

线程的状态

创建线程后调用start方法会启动线程执行run方法里的任务,执行完毕后线程就结束了。因此,线程从创建到启动再到结束,中间会有好几种状态。

先看源码,如下图

可以看到,线程的状态有6种。

NEW :  一个新创建但是尚未启动的线程

 new Thread();

如下:


RUNNABLE:正在运行或准备执行的线程

new Thread().start();

如下:


BLOCKED:   阻塞状态,等待获取synchronized锁继续执行的线程(只有在synchronized修饰时才会出现该状态

例如,两个线程执行同一个同步方法,线程1先执行,线程2执行的时候需要等线程1执行完毕释放锁资源后才有机会继续执行,此时,线程2就处于阻塞状态。

示例如下:


WAITING: 等待其他线程执行完任务然后继续执行的线程

日常开发这个是比较常见的例子:例如,一个页面需要调好几个接口来加载数据,其中接口2的参数需要从接口1的返回值拿,那么在用多线程执行的时候,接口2的线程就要等待接口1的线程先执行完毕。此时,接口2的线程就处于等待状态

示例代码:

public class TestState {

    private static Thread thread1;
    private static Thread thread2;

    public static void main(String[] args) throws InterruptedException {
        thread1 = new Thread(() -> {
            System.out.println("线程1 开始执行");
            try {
                /*合并线程,此时线程会等待线程2执行完毕*/
                thread2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程1 执行完毕");

        });

        thread2 = new Thread(() -> {
            try {

                System.out.println("线程2开始执行");
                System.out.println("线程1的状态:" + thread1.getState());
                Thread.sleep(3000);
                System.out.println("线程2执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();

            }
        });


        thread1.start();
        thread2.start();


    }
}


TIMED_WAITING: 定时等待,等待另一个线程执行固定时长的线程。

还是上面的代码  稍微改改,如下:

public class TestState {

    private static Thread thread1;
    private static Thread thread2;

    public static void main(String[] args) throws InterruptedException {
        thread1 = new Thread(() -> {
            System.out.println("线程1 开始执行");
            try {
                /*合并线程,此时线程会等待线程2执行完毕*/
                thread2.join(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程1 执行完毕");

        });

        thread2 = new Thread(() -> {
            System.out.println("线程2开始执行");
            System.out.println("线程1的状态:" + thread1.getState());
//                Thread.sleep(3000);
            System.out.println("线程2执行完毕");
        });


        thread1.start();
        thread2.start();


    }
}

运行结果如下:


TERMINTED:正常运行结束的线程或出异常的线程

示例代码:

    public static void main(String[] args) throws InterruptedException {

        Thread thread = new Thread(() -> {
            System.out.println("线程开始执行");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程执行结束");
        });
        thread.start();
        /*合并线程  等待当前线程执行完毕*/
        thread.join();
        System.out.println(thread.getState());

    }

运行结果:


好了,线程的状态就是这些,来总结一下:

线程状态状态说明
NEW新创建的线程,还没有调start
RUNNABLE待运行或正在运行中的线程
BLOCKED阻塞状态,等待获取synchronized锁的线程
WAITING等待其他线程执行完毕然后继续执行的线程,比如调用了wait,join等方法
TIMED_WAITING

处于等待指定时长的线程,比如调用了sleep(time)、wait(time)、join(time)等方法

TERMINATED正常执行完毕或出现异常的线程

下一篇:

线程休眠 (sleep)



如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客,谢谢!

以上是关于Java线程的六种状态的主要内容,如果未能解决你的问题,请参考以下文章

Java线程的六种状态

JUC并发编程 -- 回顾多线程(线程的六种状态 & wait / sleep 的区别)

Java多线程-线程状态

Java线程

Java线程及线程池状态

java 多线程Thread