Java 源码刨析 - 线程的状态有哪些?它是如何工作的?

线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在

一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源、更加轻量化,也因此被称为轻量级的进程。

   

线程的状态 JDK 1.5 之后以枚举的方式被定义在 Thread 源码中,它总共包含以下 6 状态

NEW新建状态,线程被创建出来,但尚未启动时的线程状态;

RUNNABLE就绪状态,表示可以运行的线程状态,它可能正在运行,或者是在排队等待操作系统给它分配 CPU 资源;

BLOCKED阻塞等待锁的线程状态,表示处于阻塞状态的线程正在等待监视器锁,比如等待执行 synchronized 代码块或者使用 synchronized 标记的方法;

WAITING等待状态,一个处于等待状态的线程正在等待另一个线程执行某个特定的动作,比如,一个线程调用了 Object.wait() 方法,那它就在等待另一个线程调用 Object.notify() Object.notifyAll() 方法;

TIMED_WAITING计时等待状态,和等待状态(WAITING)类似,它只是多了超时时间,比如调用了有超时时间设置的方法 Object.wait(long timeout) Thread.join(long timeout) 等这些方法时,它才会进入此状态;

TERMINATED终止状态,表示线程已经执行完成。

线程状态的源代码如下:

public enum State {

    /**

     * 新建状态,线程被创建出来,但尚未启动时的线程状态

     */

    NEW,

   

    /**

     * 就绪状态,表示可以运行的线程状态,但它在排队等待来自操作系统的 CPU 资源

     */

    RUNNABLE,

   

    /**

     * 阻塞等待锁的线程状态,表示正在处于阻塞状态的线程

     * 正在等待监视器锁,比如等待执行 synchronized 代码块或者

     * 使用 synchronized 标记的方法

     */

    BLOCKED,

   

    /**

     * 等待状态,一个处于等待状态的线程正在等待另一个线程执行某个特定的动作。

     * 例如,一个线程调用了 Object.wait() 它在等待另一个线程调用

     * Object.notify() 或 Object.notifyAll()

     */

    WAITING,

   

    /**

     * 计时等待状态,和等待状态 (WAITING) 类似,只是多了超时时间,比如

     * 调用了有超时时间设置的方法 Object.wait(long timeout) 和 

     * Thread.join(long timeout) 就会进入此状态

     */

    TIMED_WAITING,

   

    /**

     * 终止状态,表示线程已经执行完成

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjdzf.html