生命周期概述

在每个线程中都有自己的局部变量表、程序计数器、以及生命周期等,本章节将描述什么是线程的生命周期。
首先线程的生命周期可分为五个重要阶段:

  • new
  • runnable
  • running
  • blocked
  • terminated

具体流程如图所示(该图来源于《Java高并发编程详解》)
线程生命周期与CPU调度简述

1.new状态

当我们采用new关键字创建一个Thread对象时,该对象就是一个new状态,但是他并不是可执行状态,严格来讲这并不是线程,只是一个普通的对象,只有当他调用start方法的时候,才能称之为线程。

2.runnable状态

当线程对象调用start方法时,线程就会进入runnable状态,这可以说是一个准备状态,因为就算线程启动,但是还是需要CPU调度才能得到执行。所以在没有被CPU调度之前,只能是runnable可执行状态,说明该线程是可以运行,但是并没有轮到他运行。

3.running状态

线程的运行状态,当CPU轮询到这个线程,那么这个线程将从runnable状态到running状态,当进入running状态就意味着该线程开始执行其run方法

4.blocked状态

线程的阻塞状态,线程进入阻塞的原因有,

  • 线程调用wait,sleep方法
  • 进行某个I/O阻塞操作时
  • 获取某个锁资源,如synchronized锁住的资源

当进入blocked状态时,可以切换如以下几种状态

  • 直接进入terminated状态,调用stop方法
  • 线程阻塞操作结束,进入runnable状态
  • 线程完成指定休眠时间,进入runnable状态
  • wait线程被其他现场notify/notifyAll唤醒,进入runnable状态
  • 线程获取到了某个锁资源,进入runnable状态
  • 线程阻塞被打断,其他线程调用interrupt方法,进入runnable状态

5.terminated状态

线程结束状态,线程的最终状态,在该状态下线程将不会切换到其他任何状态进入terminated状态

扩展-CPU调度简单描述

可能在上面描述runnable的时候有很多人会不理解什么是CPU调度,其实在一台电脑中,一个CPU是不可能同时执行多个线程的,比如2核的CPU就只能同时执行两个线程,那么我们的CPU是如何完成并发操作的呢。那就是时间片。CPU会给每个线程分配一个时间段,我们称作为时间片,比如有4个线程同时执行,我们这里有一个一核的CPU,那么线程1拿到了CPU给他执行的时间片,他就允许线程1执行,那他就是running状态,那么其他没有被CPU分配的,那就是runnable状态,那么当线程1被分配的时间执行完时,就会4个线程重新抢夺时间片(注:是时间片完成,不是线程执行完成,线程执行完时间片拥有的时间后会记录当前位置,抢到时间片后继续执行,直到线程完成任务),那么抢到时间片的线程就会进入running状态,其他线程进入runnable状态,这种就是CPU时间片的轮询调度。可能会有人问到,为什么我们看那些线程都是同时进行,如果是这种时间片抢夺等待的方式,不会出现卡顿么,答案是不会的,因为时间片的轮询是很快的,所以在肉眼中看到就是同时进行的。

相关文章: