Java多线程 线程的六个状态详解与状态转换图

线程的六个状态详解

线程的状态为如下的六个 :

  • New 新创建: 新创建的线程, 虽然做了一些线程的准备操作, 但是还未调用start方法时候的状态.

  • Runnable 可运行: 此状态包含了两层的含义, 可运行的状态(ready)与 运行中(running)的状态. 一旦线程调用了start方法, 那么就会进入Runnable 状态. 即使是在运行中, 线程资源被其他线程抢走了, 此线程也是Runnable 状态

  • Blocked 被阻塞 : 当一个线程进入到被Synchronize修饰的代码块的时候, 并且该锁已经被其他线程拿走了, 那么此线程就会进入Blocked 状态. 注意: Blocked状态, 仅仅是针对遇到Synchronize关键字的时候, 才会可能进入Blocked 状态. 因为还有其他的锁, 也可能让线程进入到等待的情况, 但是其他的锁让线程进入等待的状态, 都不是Blocked 状态. 无论是Synchronize修饰的方法,还是代码块, 且没有拿到锁, 进入到等待的状态, 都会进入Blocked 状态. 当拿到monitor锁的时候, 就会回到runnable状态.

  • Waiting 等待: 等待状态. 没有设置 timeout的Object类的public final void wait()方法. 或者是 Thread.join方法, 或者是LockSupport.part方法 . 都会让线程从Runnable 状态, 进入 waiting状态. Object类的notify和notifyAll 和LockSupport的unpark方法, 会让线程从Waiting 转化为Runnable 状态. 而 Thread.join方法会等待join的线程执行完毕, 才会把线程状态变成Runnable 状态.

  • TIMED_ Waiting 计时等待: 此状态为带有时间期限的等待状态. 这种带有时间的, 除了可以调用方法把线程唤醒之外, 还可以等待时间到了之后被唤醒. Blocked 与Waiting的区别在于, Blocked是在等待一个排它锁, 等待其他线程释放锁. Waiting与TIMED_ Waiting 是等待被唤醒 和 等待一段时间.

  • Terminated 已终止: 此状态有两种情况可以到达. 一种是线程正常的执行完毕了,正常的退出了, 那么就会进入到Terminated 已终止的状态. 第二种情况是在run方法中, 出现了一个未捕获的异常, 导致线程意外的终止, 此时run方法可能未执行完毕, 但是依然会进入到Terminated 已终止的状态.

线程状态转换图

线程状态转换图 如下图所示, 为上面文字的图解版本, 便于记忆.
Java多线程 线程的六个状态详解与状态转换图