专业的JAVA编程教程与资源

网站首页 > java教程 正文

两张图弄清楚 Java 线程状态

temp10 2024-12-12 15:07:35 java教程 8 ℃ 0 评论

在 Java 多线程编程领域中,线程状态是一个至关重要且不可忽视的概念。线程状态描述了线程在其生命周期中的当前行为和状况,是理解和调试多线程应用的关键。通过理解线程状态,才能更有效地管理并发任务,提升应用性能和稳定性。

JDK源码中 java.lang.Thread.State 枚举定义了六种线程状态。包括:

两张图弄清楚 Java 线程状态

NEW(新建)

RUNNABLE(可运行)

BLOCKED(阻塞)

WAITING(无限等待)

TIMED_WAITING(限时等待)

TERMINATED(终止)

在任一时刻,一个 Java 线程都有且仅有一种状态。线程状态之间的转换是通过特定的方法来实现的。下表详细探讨了这些状态的定义、转换条件。

新建

New

创建线程对象,Thread t = new Thread(); 进入新建状态。

可运行

Runnable

可运行态包含了操作系统的 “就绪态Ready” 和 “运行态Running”。线程调用 Thread::start() 方法,系统为其分配必要资源,New 转为 Runnable 进入就绪态,然后线程被添加到线程调度器队列中等待执行,获取到 CPU 时间片后执行 Runnable::run() 方法。


阻塞

Blocked

线程在等待获取一个锁以进入或重新进入同步代码块时(syncronized),它会进入阻塞状态。当阻塞的原因消失,线程重新转入 Runnable (可运行)态。
“阻塞状态” 和 “等待状态” 的区别是 “阻塞状态” 在等待着获取到一个排它锁,这个时间将在另一个线程放弃这个锁的时候发生;而 “等待状态”则是在等待一段时间,或者唤醒动作的发生。在程序等待进入同步区域时,线程将进入这种状态。


无限等待

Waiting

处于无限等待状态的线程不会被分配 cpu 时间片,需要等待其他线程的操作完成或者等待 notify()/notifyAll() 消息显式唤醒。以下方法会使线程进入无限等待状态:

1. Object::wait();

2. Thread::join();

3. LockSupport::park();


限时等待

Timed

Waiting

与无限等待状态相似,进入现时等待状态的线程不会被分配 cpu 时间片,不过无需等待被其他线程显式唤醒,在一定时间后由系统唤醒。以下方式会使线程进入优先等待状态:

1. Thread::sleep();

2. Object::wait(Timeout);

3. Thread::join(Timeout);

4. LockSupport::parkNanos();

5. LockSupport::parkUntil();


终止

Terminated

进入终止状态,意味着当前线程执行结束退出,再无法回到其他状态。

1. 线程 run() 方法结束,线程自动终止(无论是正常 return 结束,还是抛出未捕获的异常时结束)

2. 调用 stop() 方法(已被废弃)

3. 调用 interrupt() 方法,线程通过检查中断标志位决定是否终止执行

4. 使用共享变量。自定义一个中断标志位,并在外部进行修改。这个标志位需要用volatile进行修饰


上表总结为第二张图:


参考资料:

JDK-1.8.0_431 源码

JSR-133 草案

《深入理解Java虚拟机》第3版——周志明


END

文章对您有用的话,记得 点赞 关注 收藏 哦,

您的支持,就是我更新的最大动力~

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表