从Java线程到kotlin协程之线程的状态

Posted XeonYu

tags:

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

上一篇: 从Java线程到kotlin协程之线程的基本使用

 

线程的状态

 

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

先看源码,如下图

 

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

 

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

 new Thread();

 

如下:


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

new Thread().start();

如下:

 


BLOCKED:   阻塞状态,等待获取锁继续执行的线程。

例如,两个线程执行同一个同步方法,线程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());

    }

 

运行结果:


好了,线程的状态就是这些。

 

 



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

 

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

从Java线程到kotlin协程之线程合并 (join)

从Java线程到kotlin协程之线程同步(wait)

从Java线程到kotlin协程之线程同步(synchronized关键字)

从Java线程到kotlin协程之线程的基本使用

从Java线程到kotlin协程之多线程的基本概念

再谈协程之suspend到底挂起了啥