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 | 正常执行完毕或出现异常的线程 |
下一篇:
如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客,谢谢!
以上是关于Java线程的六种状态的主要内容,如果未能解决你的问题,请参考以下文章