线程状态的转换

 

线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。

1、新状态:线程对象已经创建,还没有在其上调用start()方法。 

2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。 

3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。 

4、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。 

5、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

阻止线程执行

对于线程的阻止,考虑一下三个方面,不考虑IO阻塞的情况:

l 睡眠;

l 等待;

l 因为需要一个对象的锁定而被阻塞。 

  

线程状态之间的转换关系是理解Java并发编程的重要基础。Java中线程状态由`Thread.State`枚举类定义,主要包括以下六种状态:NEW(新建)、RUNNABLE(可运行/运行)、BLOCKED(阻塞)、WAITING(无时限等待)、TIMED_WAITING(有时限等待)和TERMINATED(终止)。这些状态之间通过特定的操作进行转换。 ### 线程状态及其转换 #### 1. **NEW -> RUNNABLE** 当一个线程被创建并调用`start()`方法时,它从`NEW`状态进入`RUNNABLE`状态。此时,线程处于就绪队列中,等待操作系统调度其执行[^2]。 #### 2. **RUNNABLE <-> RUNNING** `RUNNABLE`状态表示线程可以被执行,但尚未获得CPU时间片;一旦获得CPU资源,线程进入`RUNNING`状态,即实际在执行任务。这种转换是由操作系统内核调度器完成的,开发人员无法直接控制这一过程[^1]。 #### 3. **RUNNABLE -> BLOCKED** 线程尝试获取一个已经被其他线程持有的锁时会进入`BLOCKED`状态。例如,在尝试进入同步代码块或方法时,如果锁不可用,则当前线程会被挂起直到锁变得可用[^2]。 #### 4. **RUNNABLE -> WAITING** 线程调用`Object.wait()`、`Thread.join()`或者`LockSupport.park()`等方法后会进入`WAITING`状态,这意味着该线程将无限期地等待某个条件的发生。要从这个状态恢复,必须有其他线程显式唤醒它(如通过`notify()`或`notifyAll()`)[^3]。 #### 5. **RUNNABLE -> TIMED_WAITING** 与`WAITING`类似,但此状态线程会在指定的时间后自动恢复。常见的触发方式包括调用带有超时参数的方法,比如`Thread.sleep(long millis)`、`Object.wait(long timeout)`、`Thread.join(long millis)`以及`LockSupport.parkNanos()`或`LockSupport.parkUntil()`[^3]。 #### 6. **BLOCKED/WAITING/TIMED_WAITING -> RUNNABLE** 当导致线程阻塞的原因解除后,线程会重新回到`RUNNABLE`状态,并再次参与CPU资源的竞争。这可能是因为锁释放、等待条件满足或是超时结束等原因。 #### 7. **RUNNABLE -> TERMINATED** 线程正常退出其`run()`方法或因异常而提前终止时,将进入`TERMINATED`状态。一旦到达此状态线程的生命期结束,不能再被启动。 ### 状态转换图示例 虽然不能直接绘制图形,但可以通过文字描述来构建一个简单的状态转换图: ``` [NEW] | v [RUNNABLE] <--> [RUNNING] | \ / | \ / v v v [BLOCKED][WAITING][TIMED_WAITING] \ / \ / v [TERMINATED] ``` 在这个模型中,箭头指示了不同状态之间的可能转换路径。需要注意的是,某些转换需要特定的事件触发,如外部通知、超时到期等。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值