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

以前学习操作系统这门课程的时候,对线程状态的学习是比较粗略的,仅限于表面的了解,在后续学习和使用的过程中,
我发现自己之前的认知与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多线程编程核心技术》,感谢作者~

这里写图片描述

猜你喜欢

转载自blog.csdn.net/gxx_csdn/article/details/79211969