多线程-Java线程状态转换过程详解

一、概述

在这里插入图片描述
从图中可以看出,线程的状态大致可分为5种,NEW、RUNNABLE、RUNNING、BLOCKED、TERMINATED。可能读者会感到疑惑,为什么没有等待状态,其实大家可以不必刻意去区分等待状态和阻塞状态,只需要弄清楚二者的区别即可。
等待状态的定义:处于这种状态的线程无限期地等待另一个线程执行特定操作。
阻塞状态的定义:一个线程因为等待临界区的锁被阻塞产生的状态。
我们可以看出二者的区别等待状态是主动的阻塞,阻塞状态是被动的阻塞。大家可以看看能够进入等待状态的方法:Object.wait()、Thread.join()、Thread.sleep()。这些方法都是该线程已经获取到了对象的锁。而阻塞是指当前线程去和其他线程竞争锁失败。此外还有一个TIMED_WATING,这也是等待的一种,只是添加了超时机制而已,所以大家在编程或者面试中只需要理解清楚阻塞和等待的区别即可,从本质上说,他们都属于阻塞。所以本文将这三种都归于BLOCKED状态。

二、状态介绍

1、NEW状态

在Java中,我们使用new Thread()去创建一个线程,这是就对应NEW状态,但是此时仅仅只是在Java堆中创建了一个对象而已。当前线程在虚拟机中并不存在。

2、RUNNABLE状态

在线程到达了NEW状态之后,此时调用start()方法,此时JVM才真正的创建了一个线程,但是线程创建之后,并不能马上执行,它需要等待CPU资源。现在只是说它只具备执行的资格。所以在这个状态只能到RUNNING状态,因为它都没获得CPU去执行代码逻辑,就不要想通过什么方法去到阻塞状态了。

3、RUNNING状态

当CPU在任务可执行队列中选中了当前线程,那么此时该线程就能够真正的开始执行代码逻辑,此时就进入到了RUNNING状态。此时RUNNING状态能够变化的状态就比较多了。不过也很好理解:

  • 时间片用完,变为RUNNABLE.
  • 调用yield()方法,主动放弃CPU使用权,变成RUNNABLE状态。
  • 由于阻塞IO操作,进入BLOCKED状态。
  • 竞争锁失败,进入BLOCKED状态。
  • 调用sleep或者wait方法进入BLOCKED状态。
  • 调用stop方法进入TERMINATED状态。

4、BLOCKED状态

上述已经分析了进入BLOCKED状态的原因,那么BLOCKED状态能够切换到何种状态呢?

  • 阻塞操作结束,比如IO到达,进入RUNNABLE状态。
  • 线程完成了指定时间的休眠,进入RUNNABLE状态。
  • 被其他线程notify或者notifyAll唤醒,进入RUNNABLE状态。
  • 线程获取到了锁,进入RUNNABLE状态。
  • 线程在执行过程中被打断,比如其他线程调用了interupt方法,进入RUNNABLE状态。

5、TERMINATED状态

该状态是线程的最终状态,切换到该状态的线程不会在切换到其他任何状态。线程到这种状态的动作有以下几点:

  • 线程方法体正常结束。
  • 线程运行出错,意外结束。
  • JVM崩溃,所有线程被终止。
  • 调用一个线程的stop()方法强制终止线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值