说说线程的生命周期和状态

在Java中,线程的生命周期和状态是由java.lang.Thread.State枚举定义的。

目录

NEW(新建)

当线程对象被创建但尚未启动时,线程处于NEW状态。

例如:Thread t = new Thread(); 此时t的状态就是NEW。

RUNNABLE(可运行)

当线程对象调用start()方法后,线程进入RUNNABLE状态。注意,RUNNABLE状态对应操作系统线程状态中的 就绪(ready)和运行(running) 两种状态。也就是说,处于RUNNABLE状态的线程可能在等待CPU时间片,也可能正在执行。

在Java中,将就绪和运行两种状态合并为RUNNABLE状态。

BLOCKED(阻塞)

线程试图获取一个内部的对象锁(不是java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入BLOCKED状态。当其他线程释放该锁,并且线程调度器允许该线程持有该锁时,该线程将变成RUNNABLE状态。

例如,线程在等待进入synchronized方法或代码块时,可能会进入BLOCKED状态。

WAITING(等待)

线程进入等待状态,等待另一个线程执行一个特定动作。以下方法可以使线程进入WAITING状态:

Object.wait():调用此方法前,线程必须持有对象锁。调用后,线程释放锁并进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法,或者被中断。

Thread.join():等待另一个线程终止。例如,线程A调用线程B的join()方法,那么线程A将等待线程B执行完毕,此时线程A进入WAITING状态。

LockSupport.park():当前线程调用此方法也会进入等待状态。

处于WAITING状态的线程正在等待另一个线程的某个操作,例如通知或中断。

TIMED_WAITING(超时等待)

与WAITING状态类似,但线程只等待指定的时间。以下方法可以使线程进入TIMED_WAITING状态:

Thread.sleep(long millis)

Object.wait(long timeout)

Thread.join(long millis)

LockSupport.parkNanos(long nanos)

LockSupport.parkUntil(long deadline)

当等待时间超过指定时间后,线程会自动返回RUNNABLE状态,或者在被中断时返回。

TERMINATED(终止)

线程执行完毕(即run()方法执行完成)或者因为异常而退出,线程进入TERMINATED状态。termindated

注意:线程的状态转换是受JVM和操作系统线程调度器控制的。理解这些状态对于多线程编程和调试非常重要。

Java的线程状态是对操作系统底层状态的一个抽象和封装。**RUNNABLE状态对应了操作系统的就绪态和运行态,表示线程已准备好被CPU调度。**而WAITING和TIMED_WAITING状态,是Java在语言层面定义的、用于线程间协作的等待状态。处于这些状态的线程,其对应的操作系统线程已经被挂起,不在操作系统的就绪队列中,因此完全没有被CPU调度的资格。它们等待的是来自其他线程的特定信号(如notify)或超时,而不是CPU资源。

从操作系统的视角看,该线程的执行上下文已被内核保存,并且被从 CPU 调度器的就绪队列中移除,进入一个休眠状态,不再参与 CPU 时间片的竞争。只有等待的特定条件满足后,内核才会将其重新激活并放回就绪队列。Java 中的 WAITING、TIMED_WAITING 和因未抢到 synchronized 锁而产生的 BLOCKED 状态 ,其底层的操作系统线程通常都处于这种被挂起 的状态

相关推荐
侠客行03176 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪6 小时前
深入浅出LangChain4J
java·langchain·llm
灰子学技术8 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚8 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎8 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
二十雨辰8 小时前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码9 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚9 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂9 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
pas1369 小时前
41-parse的实现原理&有限状态机
开发语言·前端·javascript