线程包括哪些状态?状态之间是如何转变的?
2023-09-11 14:15:24 时间
线程的生命周期
线程包括哪些状态的问题说专业一点就是线程的生命周期。
不同的编程语言对线程的生命周期封装是不同的。
Java 中线程的生命周期
Java 语言中线程共有六种状态。
- NEW(初始化状态)
- RUNNABLE(可运行 / 运行状态)
- BLOCKED(阻塞状态)
- WAITING(无限时等待)
- TIMED_WAITING(有限时等待)
- TERMINATED(终止状态) 在操作系统层面,Java 线程中的 BLOCKED、WAITING、TIMED_WAITING 是一种状态(休眠状态)。即只要 Java 线程处于这三种状态之一,就永远没有 CPU 的使用权。
如图:
Java 中线程的状态的转变
1. NEW 到 RUNNABLE 状态
Java 刚创建出来的 Thread 对象就是 NEW 状态,不会被操作系统调度执行。从 NEW 状态转变到 RUNNABLE 状态调用线程对象的 start() 方法就可以了。
2. RUNNABLE 与 BLOCKED 的状态转变
- synchronized 修饰的方法、代码块同一时刻只允许一个线程执行,其他线程只能等待,等待的线程会从 RUNNABLE 转变到 BLOCKED 状态。
- 当等待的线程获得 synchronized 隐式锁时,就又会从 BLOCKED 转变到 RUNNABLE 状态。
在操作系统层面,线程是会转变到休眠状态的,但是在 JVM 层面,Java 线程的状态不会发生变化,即 Java 线程的状态会保持 RUNNABLE 状态。JVM 层面并不关心操作系统调度相关的状态,因为在 JVM 看来,等待 CPU 使用权(操作系统层面处于可执行状态)与等待 I/O(操作系统层面处于休眠状态)没有区别,都是在等待某个资源,都归入了 RUNNABLE 状态。
Java 在调用阻塞式 API 时,线程会阻塞,指的是操作系统线程的状态,并不是 Java 线程的状态。
3. RUNNABLE 与 WAITING 的状态转变
- 获得 synchronized 隐式锁的线程,调用无参数的 Object.wait() 方法,状态会从 RUNNABLE 转变到 WAITING;调用 Object.notify()、Object.notifyAll() 方法,线程可能从 WAITING 转变到 RUNNABLE 状态。
- 调用无参数的 Thread.join() 方法。join() 是一种线程同步方法,如有一线程对象 Thread t,当调用 t.join() 的时候,执行代码的线程的状态会从 RUNNABLE 转变到 WAITING,等待 thread t 执行完。当线程 t 执行完,等待它的线程会从 WAITING 状态转变到 RUNNABLE 状态。
- 调用 LockSupport.park() 方法,线程的状态会从 RUNNABLE 转变到 WAITING;调用 LockSupport.unpark(Thread thread) 可唤醒目标线程,目标线程的状态又会从 WAITING 转变为 RUNNABLE 状态。
4. RUNNABLE 与 TIMED_WAITING 的状态转变
- Thread.sleep(long millis)
- Object.wait(long timeout)
- Thread.join(long millis)
- LockSupport.parkNanos(Object blocker, long deadline)
- LockSupport.parkUntil(long deadline)
TIMED_WAITING 和 WAITING 状态的区别,仅仅是调用的是超时参数的方法。
5. RUNNABLE 到 TERMINATED 状态
- 线程执行完 run() 方法后,会自动转变到 TERMINATED 状态
- 执行 run() 方法时异常抛出,也会导致线程终止
Thread类的 stop() 方法已经不建议使用
来一道刷了进BAT的面试题?
相关文章
- spring的有状态BEAN和无状态BEAN
- codeforces B - Preparing Olympiad(dfs或者状态压缩枚举)
- php分享十七:http状态码
- js navigator.wakeLock 保持屏幕唤醒状态
- 判断计算机的联机状态
- 大叔问题定位分享(50)hbase有一个region一直处于rit状态(非超时)
- Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
- java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器
- C#中如何判断线程当前所处的状态
- Java线程的5种状态及切换(透彻讲解)-京东面试
- Android LinearLayout实现类似Button的点击效果且保留状态
- 【Kotlin 协程】协程启动 ⑥ ( 协程生命周期状态 | 新创建 New | 活跃 Active | 完成中 Completing | 已完成 Completed | 取消中 | 已取消 )
- java通过代码控制线程状态,解决线程不安全的问题。
- 19 01-通过状态掩码读取DTC数目
- lotus 扇区状态 RecoverDealIDs
- 第二人生的源码分析(七十五)启动状态详细说明
- 高并发必备篇(四):线程的状态、调度和操作方法(下)
- 获取wlan0&ð0联网状态