代码讲解Java线程转换
1. 新建(New)
当我们使用 new Thread() 创建线程对象后,Thread.start()方法前,线程处于新建状态。
未重写run方法
输出NEW新生状态
重写run方法
输出NEW新生状态
2. 就绪(Runnable)
调用 start()方法后,线程进入就绪状态。
线程此时具有运行资格,但 是否运行取决于操作系统的调度器。
Java线程没有区分就绪和运行状态
可以看到调用start方法后,线程处于Runnable运行状态。
但这不代表这个线程没有处于运行状态,
Java 中的 Thread.State.RUNNABLE 包含了 “就绪”和“运行”两种状态的统称,它并不区分线程是正在 执行(Running),还是仅仅处于 就绪(Ready)。
所以我们无法进行区分
为什么不提供 Running 状态?
因为: 在 Java 层,你无法准确知道某线程是不是“此刻正好被 CPU 执行”,这个是 OS 调度器控制的; 如果提供了 “RUNNING” 状态,反而可能误导开发者(因其可能变化极快,每毫秒都可能被抢占)。
3. 运行(Running)
当线程被操作系统调度后,获得 CPU 时间片,才会进入运行状态。
实际执行线程中的 run()方法。
需要注意:Java 中的 就绪 + 运行 == 操作系统的 Running 状态。
4. 阻塞状态(Blocked / Waiting / Timed Waiting)
同步阻塞(Blocked:线程试图进入 synchronized`块或方法,但未获得锁。)
import java.util.concurrent.ThreadLocalRandom;public class ThreadStatus{private static Object object = new Object(); //锁对象public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(()->{synchronized (object){System.out.println("线程1正在运行");while (true){}}});Thread thread2= new Thread(()->{synchronized (object){System.out.println("线程2正在运行");while (true){}}});thread1.start();thread2.start();Thread.sleep(100); //保证某一个线程拿到锁System.out.println("线程1状态"+thread1.getState());System.out.println("线程2状态"+thread2.getState());}}
状态输出
等待(Waiting:线程调用 `wait()` / `join()` 等方法进入无限等待。
超时等待(Timed Waiting):线程调用 `sleep()` / `wait(timeout)` / `join(timeout)` 等进入限时等
这些状态均由运行状态进入,且恢复运行都需先进入“就绪”状态再等待调度。
5. 死亡(Terminated)
当线程的 `run()` 方法执行完毕,或者抛出未捕获异常,线程进入死亡状态,生命周期终结。
如果想要具体的Java代码线程转化,可以关注+私信,回复666