线程的生命周期-CSDN博客

86 阅读3分钟

 从操作系统的角度理解:

  • 线程是在调用start方法之后,它才变成就绪状态,在就绪状态下,线程开始去抢夺CPU的执行权,它是正在抢,但是还没有抢到,没有抢到就无法执行代码。所以就绪状态它是有执行资格,但是没有执行权。
  • 有执行资格是指你可以去抢CPU的执行权。
  • 没有执行权指的是你现在还没有抢到,不能去执行代码,所以说你是没有执行权的。
  • 就绪状态干的事情就是不停的去抢CPU。

 从虚拟机的角度理解:

  •  新建状态只有Java特征,没有线程特征。
  • 一定要调用start方法才能进入到Runnable可运行 / 就绪状态。
  • 线程是并发执行的,可运行状态不代表真的能跑,因为还没有抢到CPU的执行权。
  • 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢?Java中的线程
  • 状态被定义在了java.lang.Thread.State枚举类中,State枚举类的源码如下:
public class Thread {
    
    public enum State {
    
        /* 新建 */
        NEW , 

        /* 可运行状态 */
        RUNNABLE , 

        /* 阻塞状态 */
        BLOCKED , 

        /* 无限等待状态 */
        WAITING , 

        /* 计时等待 */
        TIMED_WAITING , 

        /* 终止 */
        TERMINATED;
    
	}
    
    // 获取当前线程的状态
    public State getState() {
        return jdk.internal.misc.VM.toThreadState(threadStatus);
    }
    
}

通过源码我们可以看到Java中的线程存在6种状态,每种线程状态的含义如下:

线程状态具体含义
NEW新建状态:一个尚未启动的线程的状态。也称之为初始状态、开始状态。线程刚被创建,但是并未启动。还没调用start方法。MyThread t = new MyThread()只有线程象,没有线程特征。
RUNNABLE可运行状态 / 就绪状态:当我们调用线程对象的start方法,那么此时线程对象进入了RUNNABLE状态。那么此时才是真正的在JVM进程中创建了一个线程,线程一经启动并不是立即得到执行,线程的运行与否要听令与CPU的调度,那么我们把这个中间状态称之为可执行状态(RUNNABLE)也就是说它具备执行的资格,但是并没有真正的执行起来而是在等待CPU的度。抢到CPU的执行权就是抢到了CPU执行的时间片!
BLOCKED阻塞状态 / 挂起状态:当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。被其他线程抢走了CPU的执行权力的时候,就挂起了这个线程!
WAITING一个正在等待的线程的状态。也称之为等待状态。造成线程等待的原因有两种,分别是调用Object.wait()、join()方法。处于等待状态的线程,正在等待其他线程去执行一个特定的操作。例如:因为wait()而等待的线程正在等待另一个线程去调用notify()或notifyAll();一个因为join()而等待的线程正在等待另一个线程结束。
TIMED_WAITING一个在限定时间内等待的线程的状态。也称之为限时等待状态。造成线程限时等待状态的原因有三种,分别是:Thread.sleep(long),Object.wait(long)、join(long)。
TERMINATED一个完全运行完成的线程的状态。也称之为终止状态、结束状态

 各个状态的转化,如下图所示: