线程的五种状态

1.线程的五种状态

线程的状态在 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,

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

线程的工作模式是,首先先要创建线程并指定线程需要执行的业务方法,然后再调用线程的
start() 方法,此时线程就从 NEW(新建)状态变成了
RUNNABLE(就绪)状态,此时线程会判断要执行的方法中有没有 synchronized
同步代码块,如果有并且其他线程也在使用此锁,那么线程就会变为
BLOCKED(阻塞等待)状态,当其他线程使用完此锁之后,线程会继续执行剩余的方法。

当遇到 Object.wait()Thread.join() 方法时,线程会变为
WAITING(等待状态)状态,如果是带了超时时间的等待方法,那么线程会进入
TIMED_WAITING(计时等待)状态,当有其他线程执行了 notify()notifyAll()
方法之后,线程被唤醒继续执行剩余的业务方法,直到方法执行完成为止,此时整个线程的流程就执行完了,执行流程如下图所示:
image

原文地址:https://www.cnblogs.com/xiaodou00/p/13499417.html