【多线程】线程的生命周期

搞懂生命周期中各个节点的状态转换机制。

通用的线程生命周期

在这里插入图片描述

  • 初始状态:指的是线程已经被创建,但是还不允许分配CPU执行。(这里的被创建,仅仅是在编程语言层面被创建,而在操作系统层面,真正的线程还没有创建)
  • 可运行状态:指的是线程可以分配CPU执行。这种状态下,真正的操作系统线程已经被成功创建了,所以可以分配CPU执行。
  • 当有空闲的CPU时,操作系统会将其分配给一个处于可运行状态的线程,被分配到CPU的线程的状态就转换成了运行状态。
  • 运行状态的线程如果调用一个阻塞的API(例如以阻塞方式读文件)或等待某个事件(例如条件变量),那么线程的状态就会转换到休眠状态,同时释放CPU使用权,休眠状态的线程永远没有机会获得CPU的使用权。当等待的事件出现,线程就会从休眠状态转换到可运行状态。
  • 线程执行完或者出现异常就会进入终止状态,终止状态的线程不会切换到其他任何状态,进入终止状态也就意味着线程的生命周期结束了。

Java语言里把 可运行状态的运行状态 合并了,这两个状态在操作系统调度层面有用,而JVM曾main不关心这两个状态,因为JVM把线程调度交给操作系统处理了。

Java中线程的生命周期及其状态转换

在这里插入图片描述
○ NEW:初始化状态
○ RUNNABLE:可运行/运行状态
○ BLOCKED:阻塞状态
○ WAITING:无时限等待
○ TIMED_WAITING:有时限等待
○ TERMINATED:终止状态

事实上,在操作系统曾main,Java线程中的(四色部分)三个是一种状态,即休眠状态,也可理解为导致线程休眠状态的三种原因。也就是说只要Java线程处于这三种状态之一,那么这个线程就永远没有CPU的使用权。

2.1 RUNNABLE 与 BLOCKED 的状态转换

只有一种场景会触发这种转换,就是线程等待 synchronized 的隐式锁。(获得时)

2.2 RUNNABLE 与 WAITING 的状态转换

场景一:获得 synchronized 隐式锁的线程,调用无参数的 Object.wait() 方法。
场景二:调用无参数的 Thread.join() 方法。
场景三:调用 LockSupport.park() 方法。调用 LockSupport.park(Thread thread) 可唤醒目标线程,目标线程又会从 WAITING 状态转换到 RUNNABLE。

2.3 RUNNABLE 与 TIMED_WAITING 的状态转换

	a. 调用带超时参数的 Thread.sleep(long millis) 方法
	b. 获得 synchronized 隐式锁的线程,调用带超时参数的 Object.wait(long timeout) 方法
	c. 调用带超时参数的 Thread.join(long millis)方法
	d. 调用带超时参数的 LockSupport.parkNanos(Object blocker, long deadline) 方法
	e. 调用带超时参数的 LockSupport.parkUnitl(long deadline) 方法

2.4 NEW 到 RUNNABLE 的状态转换

Java刚创建出来的 Thread 对象就是 NEW 状态,而创建 Thread 对象主要有2种方法。
1)继承 Thread对象,重写 run() 方法。

在这里插入图片描述

2)实现 Runnable 接口,重写 run() 方法,并将该实现类作为创建 Thread 对象的参数。

在这里插入图片描述

2.5 RUNNABLE 到 TERMINATED 状态转换

线程执行完 run() 方法后,会自动转换到 TERMINATED 状态,当然如果执行 run() 方法时异常抛出,也会导致线程终止。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨幂等

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值