欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

终止状态,即线程执行完毕。

下面用一个图更能清晰明了说明线程的几种状态之间关系:

Java线程的几种状态


代码实现

我们从理论的角度了解到线程有六种状态,那么如何通过代码来了解到线程当前处于什么状态,在什么情况下使得线程处于该种状态呢?

代码实现细节如下:

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并发编程的艺术》