从Java线程到kotlin协程之线程的状态
Posted XeonYu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从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协程之线程的状态的主要内容,如果未能解决你的问题,请参考以下文章