多线程——线程的几种状态 (Java API版)

本文详细介绍了Java中线程的六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,分别阐述了各种状态的含义、触发条件及其在多线程同步中的角色。通过对Java API的解析,帮助读者深入理解线程生命周期的不同阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前学习操作系统这门课程的时候,对线程状态的学习是比较粗略的,仅限于表面的了解,在后续学习和使用的过程中,
我发现自己之前的认知与Java api中定义的线程状态是有出入的,在使用过程中也会有很多误解,
所以按照java.lang.Thread.State中的详细定义和说明,进行了如下整理,作为自我总结和学习。

根据Java api,Java中线程一共有如下6种状态,即NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED

1. NEW

NEW: 新建状态,指已经创建了线程对象,但是该线程尚未启动,即还没有调用start()方法。根据Java api,定义如下:

Thread state for a thread which has not yet started

2. RUNNABLE

RUNNABLE: 按照字面翻译是“可运行的”, 但是根据Java api中的定义:

A thread in the runnable state is executing in the jvm but it may be waiting for other resources from the operating system such as processor

因此,说该状态是“运行中”更恰当,此外在该状态下线程有可能会因对操作系统的资源请求(例如IO请求)而处于等待中,
总之,该状态下发生的等待是与系统资源有关的,与锁无关。

3. BLOCKED

BLOCKED:阻塞状态,根据Java api中的定义:

A thread in the blocked state is waiting for a monitor lock to enter a synchronized block/method or reenter a synchronized block/method after calling Object.wait()

这个状态发生在涉及到多个线程同步的问题中,线程等待获取从而进入临界区,因此,值得注意的是,
该状态的等待与上述runnable状态下中可能出现的等待,它们的诱发原因是不同的。
总之,该状态下线程在等待进入临界区

4. WAITING

WAITING:等待状态,根据Java api,该状态的诱发原因如下:

A thread is in the waiting state due to calling one of the following methods:
Object.wait with no timeout
Thread.join with no timeout
LockSupport.park

因此,该状态一般出现在调用wait()、join()和park()的情况。
根据Java api,对改状态的定义如下:

A thread in the waiting state is waiting for another thread to perform a particular action. For example, a thread that has called Object.wait() on an object is waiting for another thread to call Object.notify() or Object.notifyAll() on that object. A thread that has called Thread.join() is waiting for a specified thread to terminate

这个状态是指线程在是获取了锁之后,由于上述方法被调用,从而导致线程失去对锁的所有权,进入等待队列,等待其他线程执行相应的动作。
参看wait()方法和join方法的介绍,未完待续~

5. TIMED_WAITING

TIME_WAITING:有限时间的等待状态,根据Java api的定义,该状态的诱发原因如下:

Thread state for a waiting thread with a specified waiting time. A thread is in the timed waiting state due to calling one of the following methods with a specified positive waiting time:
Thread.sleep
Object.wait with timeout
Thread.join with timeout
LockSupport.parkNanos
LockSupport.parkUntil

因此,该状态一般出现在调用
sleep(long millis)、wait(long timeout)、join(long millis)、parkNanos(long nanos)和 parkUntil(long deadline)的情况。

6. TERMINATED

TERMINATED:终止状态/死亡状态,指线程执行完毕,该线程的run()方法已执行完毕。根据Java api,定义如下:

The thread has completed execution.

其实,根据API中的英文定义,很容易体会和理解线程的各个状态是什么样子的,反而硬是要翻译过来的话,却无法恰当描述出来。

根据上述内容画的流程图如下:

这里写图片描述

参考链接:http://www.jiacheo.org/blog/338
参考书籍:《Java多线程编程核心技术》,感谢作者~

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值