news 2026/6/15 17:19:25

Java线程状态图解:从创建到终止的全生命周期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java线程状态图解:从创建到终止的全生命周期

文章目录

  • Java线程状态图解:从创建到终止的全生命周期
    • 一、引言:线程的重要性
    • 二、线程的状态图
    • 三、线程的全生命周期
      • 1. 创建态(New)
      • 2. 就绪态(Runnable)
      • 3. 运行态(Running)
      • 4. 阻塞态(Blocked)
      • 5. 终止态(Terminated)
    • 四、线程状态的转换
      • 1. 创建态到就绪态
      • 2. 就绪态到运行态
      • 3. 运行态到阻塞态
      • 4. 阻塞态到就绪态
      • 5. 运行态到终止态
    • 五、实际案例:银行取款机
      • 案例背景
      • 代码实现
      • 案例分析
    • 六、总结
    • 希望这篇指南能帮助你更好地理解Java中的线程状态及其转换!如果你有任何问题或需要进一步的帮助,请随时留言。
      • 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

Java线程状态图解:从创建到终止的全生命周期

大家好!我是闫工,今天我们要聊一个非常重要的Java核心技术——线程的状态与生命周期。线程是Java并发编程的基础,也是面试中经常被问到的知识点。作为一个热爱“肝”的码农,我深知线程的重要性。今天这篇文章,我会用一张图来详细讲解Java线程从创建到终止的全生命周期,并结合实际案例和代码示例,让大家彻底搞懂线程的状态转换。

一、引言:线程的重要性

在Java中,多线程编程是提升程序性能的重要手段。通过合理利用多线程,我们可以让程序同时执行多个任务,充分利用 CPU 的计算能力。比如,一个Web服务器需要同时处理多个用户的请求,这时候就需要用到多线程。

但是,说到线程的状态,很多同学可能会有点懵。线程不是一直运行的吗?为什么会有那么多状态?今天我们就来详细了解一下Java线程的状态和生命周期。

二、线程的状态图

为了让大家更直观地理解线程的状态转换,我画了一张简单的状态图:

创建态(New) -> 就绪态(Runnable) -> 运行态(Running) | | ------------------------- | | 阻塞态(Blocked) 终止态(Terminated)

不过,这张图有点简单。实际上,Java线程的状态还有更多细节。下面我来详细讲解每个状态。

三、线程的全生命周期

1. 创建态(New)

当用new关键字创建一个Thread对象时,线程就处于“创建态”。此时,线程并没有开始运行,只是一个普通的Java对象。

代码示例:

// 创建一个线程ThreadmyThread=newThread(()->{System.out.println("我在跑!");});

此时,myThread的状态是New。注意,start()方法还没调用。

2. 就绪态(Runnable)

当调用thread.start()方法后,线程进入“就绪态”,也称为可运行状态。这并不意味着线程立即开始执行,而是表示线程已经做好了运行的准备,随时可能被CPU调度去执行。

代码示例:

// 线程处于Runnable状态myThread.start();

3. 运行态(Running)

当线程从就绪态被调度到CPU上开始执行时,线程进入“运行态”。此时,线程正在执行run()方法中的代码。

代码示例:

// 线程处于Running状态publicclassMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("我在跑了!");}}

4. 阻塞态(Blocked)

当线程在运行过程中因为某些原因无法继续执行时,就会进入“阻塞态”。常见的阻塞原因包括:

  • 等待用户输入:比如读取键盘输入。
  • 等待I/O操作完成:比如从网络或磁盘读取数据。
  • 等待锁释放:比如在用synchronized关键字加锁的情况下。

代码示例:

// 阻塞态示例:等待用户输入Scannerscanner=newScanner(System.in);System.out.println("请输入你的名字:");Stringname=scanner.nextLine();

5. 终止态(Terminated)

当线程完成run()方法中的所有任务后,就会进入“终止态”。此时,线程已经死亡,无法再被唤醒。

代码示例:

// 线程终止状态myThread.join();// 等待线程执行完毕System.out.println("线程已终止!");

四、线程状态的转换

1. 创建态到就绪态

当调用start()方法时,线程从创建态进入就绪态。

// 转换:New -> RunnableThreadmyThread=newThread(...);myThread.start();

2. 就绪态到运行态

当线程被调度到CPU上执行时,从就绪态进入运行态。

// 转换:Runnable -> RunningpublicclassMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("我在跑了!");}}

3. 运行态到阻塞态

当线程在运行过程中遇到需要等待的情况,比如等待用户输入或I/O操作完成时,会进入阻塞态。

// 转换:Running -> BlockedScannerscanner=newScanner(System.in);System.out.println("请输入你的名字:");Stringname=scanner.nextLine();

4. 阻塞态到就绪态

当等待的资源准备好后,线程会重新回到就绪态,等待被调度。

// 转换:Blocked -> Runnable// 用户输入完成后,线程重新进入Runnable状态Stringname=scanner.nextLine();

5. 运行态到终止态

当线程完成run()方法中的所有任务后,会进入终止态。

// 转换:Running -> TerminatedpublicclassMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("我在跑了!");// 任务完成,线程终止}}

五、实际案例:银行取款机

为了让大家更好地理解线程的状态转换,我来举一个实际的例子——银行ATM机。

案例背景

假设我们有一个银行ATM机,用户可以进行存款和取款操作。每个用户的操作都需要在线程中执行。我们需要模拟多个用户的并发操作,并观察线程的状态变化。

代码实现

publicclassATM{privateintbalance=1000;// 初始金额publicsynchronizedvoiddeposit(intamount){System.out.println("正在存款:"+amount);try{Thread.sleep(2000);// 模拟处理时间}catch(InterruptedExceptione){e.printStackTrace();}balance+=amount;System.out.println("存款完成,当前余额:"+balance);}publicsynchronizedvoidwithdraw(intamount){System.out.println("正在取款:"+amount);try{Thread.sleep(2000);// 模拟处理时间}catch(InterruptedExceptione){e.printStackTrace();}if(balance>=amount){balance-=amount;System.out.println("取款成功,当前余额:"+balance);}else{System.out.println("余额不足,取款失败!");}}publicstaticvoidmain(String[]args){ATMatm=newATM();// 创建存款线程ThreaddepositThread1=newThread(()->atm.deposit(500));ThreaddepositThread2=newThread(()->atm.deposit(300));// 创建取款线程ThreadwithdrawThread1=newThread(()->atm.withdraw(800));ThreadwithdrawThread2=newThread(()->atm.withdraw(400));// 启动所有线程depositThread1.start();depositThread2.start();withdrawThread1.start();withdrawThread2.start();// 等待所有线程完成try{depositThread1.join();depositThread2.join();withdrawThread1.join();withdrawThread2.join();}catch(InterruptedExceptione){e.printStackTrace();}}}

案例分析

在这个案例中,我们模拟了多个用户的并发操作:

  1. 创建态:当线程被创建时,处于创建态。
  2. 就绪态:调用start()方法后,线程进入就绪态,等待CPU调度。
  3. 运行态:当线程被调度到CPU上执行时,进入运行态。
  4. 阻塞态:在存款和取款操作中,我们使用了synchronized关键字来确保线程安全。当一个线程正在执行同步代码块时,其他尝试访问同一资源的线程会被阻塞,进入阻塞态。
  5. 终止态:当线程完成任务后,进入终止态。

通过这个案例,我们可以清楚地看到线程在不同状态之间的转换过程。

六、总结

  • 线程有五个基本状态:创建态、就绪态、运行态、阻塞态和终止态。
  • 线程的状态转换可以通过调用不同的方法(如start()join())来实现。
  • 在实际开发中,理解线程的状态转换对于编写高效且安全的多线程程序非常重要。

希望这篇指南能帮助你更好地理解Java中的线程状态及其转换!如果你有任何问题或需要进一步的帮助,请随时留言。

📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

成体系的面试题,无论你是大佬还是小白,都需要一套JAVA体系的面试题,我已经上岸了!你也想上岸吗?

闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了1000+ 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 + 详细解析,并附赠高频考点总结、简历模板、面经合集等实用资料!

✅ 覆盖大厂高频题型
✅ 按知识点分类,查漏补缺超方便
✅ 持续更新,助你拿下心仪 Offer!

📥免费领取👉 点击这里获取资料

已帮助数千位开发者成功上岸,下一个就是你!✨

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 15:02:16

计算机毕设java污水零直排村智慧管家系统 基于Java的零排放乡村智能管理平台设计与实现 Java驱动的污水零直排村庄智慧管理系统开发

计算机毕设java污水零直排村智慧管家系统365159(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着社会的快速发展,环境保护和可持续发展成为全球关注的焦点。在乡村…

作者头像 李华
网站建设 2026/6/15 12:11:46

计算机毕设Java基于JAVA的卷烟厂库存管理系统 基于Java技术的烟草企业库存管理解决方案 Java驱动的卷烟企业库存信息化管理系统设计

计算机毕设Java基于JAVA的卷烟厂库存管理系统7r0609 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着信息技术的飞速发展,企业对库存管理系统的智能化和高效化需…

作者头像 李华
网站建设 2026/6/14 21:41:00

拖延症福音 10个AI论文写作软件测评:自考毕业论文+格式规范全攻略

在当前学术写作日益依赖技术辅助的背景下,AI论文写作工具已成为提升效率的重要帮手。尤其是自考群体,在论文撰写过程中常面临时间紧张、格式不熟、内容缺乏逻辑等问题,亟需高效、易用的解决方案。为此,我们基于2026年的实测数据与…

作者头像 李华
网站建设 2026/6/15 16:39:15

别再瞎找了!8个AI论文平台测评:专科生毕业论文+开题报告全攻略

在当前高校教育不断深化的背景下,专科生的学术写作需求日益增长,但面对毕业论文和开题报告的撰写任务,许多学生仍感到无从下手。尤其是对于时间紧张、经验不足的学生来说,如何高效完成高质量的学术内容成为一大难题。为此&#xf…

作者头像 李华