Java线程的几种状态

概述

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值