Java线程的几种状态
程序员文章站
2022-03-08 20:12:46
...
概述
Java中线程是有其生命周期的,细分下来共有六种不同的状态,在某一时刻线程只能处于其中一种状态。六种状态分别如下:
1)NEW
初始状态,线程被创建,但是还没有调用start函数。
2)RUNNABLE
运行状态,其实在Java线程中将就绪和运行两种状态统称为运行中。
3)BLOCKED
阻塞状态,表示线程阻塞与锁。
4)WAITING
等待状态,表示线程进入等待,需要等待其他线程完成某些操作。
5)TIME_WAITING
超时等待状态,与WAITING是不同的,改状态是线程可以在指定的时间自行返回,例如自行sleep函数。
6)TERMINATED
终止状态,即线程执行完毕。
下面用一个图更能清晰明了说明线程的几种状态之间关系:
代码实现
我们从理论的角度了解到线程有六种状态,那么如何通过代码来了解到线程当前处于什么状态,在什么情况下使得线程处于该种状态呢?
代码实现细节如下:
ThreadState.java
public class ThreadState {
public static void main(String []args){
new Thread(new TimeWaiting(), "TimeWaiting").start();
new Thread(new Waiting(), "WaitingThread").start();
new Thread(new Blocked(), "BlockedThread---1").start();
new Thread(new Blocked(), "BlockedThread---2").start();
}
static class TimeWaiting implements Runnable{
@Override
public void run() {
while (true) {
SleepUtils.second(100);
}
}
}
static class Waiting implements Runnable{
@Override
public void run() {
while (true){
synchronized (Waiting.class){
try {
Waiting.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
static class Blocked implements Runnable{
@Override
public void run() {
while (true){
SleepUtils.second(100);
}
}
}
}
SleepUtils.java
public class SleepUtils {
public static void second(long seconds){
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {
}
}
}
当我们运行程序的时候,打开终端或编辑器的命令行,输入jps回车,可以查看到大致如下内容:
D:\JavaProject\MyJavaProject>jps
7984
7524 Jps
7256 Launcher
1916 ThreadState
jps:它是显示出当前系统中所有Java进程;
然后再输入:jstack 1916,可以看到如下内容:
"BlockedThread---2" #15 prio=5 os_prio=0 tid=0x000000001d734000 nid=0x1f14 waiting on condition [0x000000001f11f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
"BlockedThread---1" #14 prio=5 os_prio=0 tid=0x000000001d733800 nid=0x14d0 waiting on condition [0x000000001fc6e000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
"WaitingThread" #13 prio=5 os_prio=0 tid=0x000000001d730800 nid=0x1fd4 in Object.wait() [0x000000001fa5e000]
java.lang.Thread.State: WAITING (on object monitor)
"TimeWaiting" #12 prio=5 os_prio=0 tid=0x000000001d72f000 nid=0x1f20 waiting on condition [0x000000001f8ff000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
通过内容我们能够很容易看到当前几个线程所处的状态。
参考资料
《Java并发编程的艺术》
上一篇: AI绘制一个高端有质感的欧式花纹
下一篇: 《学习多线程03》关键字volatile