线程都有哪几种状态?

点一点,有惊喜,欢迎各位大佬指点

本篇将详细讲述线程的所有状态,如果有想了解其他内容,请点击上面哦!!!


一、线程的状态

线程的状态是一个枚举类型Thread.State,一共有六种类型,分别是:

  1. NEW: 安排了工作, 还未开始行动
  2. RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.
  3. BLOCKED: 这几个都表示排队等着其他事情,表示等待获取锁
  4. WAITING: 这几个都表示排队等着其他事情,线程在无限等待唤醒
  5. TIMED_WAITING: 这几个都表示排队等着其他事情,线程在等待唤醒,但设置了时限
  6. TERMINATED: 工作完成了
public class ThreadDemo {
    public static void main(String[] args) {
        for (Thread.State state: Thread.State.values()) {
            System.out.println(state);
        }
    }
}

下面来详细讲述一下:

1.什么是NEW状态?

当线程对象创建后,就是进入了新建状态:

 2.什么是RUNNABLE状态?

当线程对象调用start()方法,线程就是进入了就绪状态。在就绪状态中,可分为正在工作和即将开始工作,并不是执行了start()此线程立即就会执行。

3.什么是Blocked状态?

阻塞状态是线程因为某种原因放弃CPU的使用权,暂停或停止运行,直到线程进入就绪状态,才有机会获得到CPU的注意,再次转入运行状态。

其中阻塞又分为三种情况:

1.等待阻塞:

运行的线程执行wait方法,则该线程会释放占用的所有资源,进入这个状态后是不能被自动唤醒的,需要调用notify/notifyAll 方法才能被唤醒。

2.同步阻塞:

运行的线程在获取对象的同步锁(synchronized)时,若该对象同步锁被其他线程占用了,则该线程会进入阻塞状态。

3.其他阻塞:

运行的线程执行sleep/join方法,或者发出了I/O请求时,线程会变为阻塞状态。当sleep方法等待超时、join方法等待线程终止或者超时、I/O处理完毕时,线程将重新转入就绪状态。

4.什么是RUNNING状态?

就绪状态的线程获取到了CPU使用权,执行程序代码,就绪状态是进入到运行状态的入口,要想运行,就要先进入就绪态。

5.什么是TERMINATED状态?

线程执行完毕或者因为其他原因退出运行,表示该线程生命周期结束。

二、线程的状态图

 三、线程状态转换

3.1 NEW、RUNNABLE、TERMINATED状态转换

class ThreadDemo3{
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
            }
        }, "李四");
        System.out.println(t.getName() + ": " + t.getState());;
        t.start();
        while (t.isAlive()) {
            System.out.println(t.getName() + ": " + t.getState());;
        }
        System.out.println(t.getName() + ": " + t.getState());;
    }
}

3.2 WAITING 、 BLOCKED 、 TIMED_WAITING 状态的转换

class ThreadDemo4{
    public static void main(String[] args) {
        final Object object = new Object();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object) {
                    while (true) {
                        try {
                            Thread.sleep(1000);
//                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        },"t1");
        t1.start();
        System.out.println(t1.getState());

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object) {
                    System.out.println("hehe");
                }
            }
        }, "t2");
        t2.start();
        System.out.println(t1.getState());
    }
}

 

使用 jconsole 可以看到 t1 的状态是 TIMED_WAITING , t2 的状态是 BLOCKED

3.3WAITING状态转换

class ThreadDemo4{
    public static void main(String[] args) {
        final Object object = new Object();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object) {
                    while (true) {
                        try {
//                            Thread.sleep(1000);
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        },"t1");
        t1.start();
        System.out.println(t1.getState());

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object) {
                    System.out.println("hehe");
                }
            }
        }, "t2");
        t2.start();
        System.out.println(t1.getState());
    }
}

 

 使用 jconsole 可以看到 t1 的状态是 WAITING

结论:

  1. BLOCKED 表示等待获取锁, WAITING 和 TIMED_WAITING 表示等待其他线程发来通知.
  2. TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在无限等待唤醒
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值