关于Java线程的状态网上的说法不一,有的说是6种状态,有的说是5中状态,索性就查看了一下Java源码。Thread类里面有一个枚举类,如下:

public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;
}

这个枚举类里面有6种类型,所以Java中的线程有6种状态。

关于各种状态的简单说明:

  1. NEW(初始):线程被创建后尚未启动。
  2. RUNNABLE(运行):包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在运行,也可能正在等待系统资源,如等待CPU为它分配时间片。
  3. BLOCKED(阻塞):线程阻塞于锁。
  4. WAITING(等待):线程需要等待其他线程做出一些特定动作(通知或中断)。
  5. TIME_WAITING(超时等待):该状态不同于WAITING,它可以在指定的时间内自行返回。
  6. TERMINATED(终止):该线程已经执行完毕。

状态图

1. 初始状态

通过继承Thread类或实现Runnable接口得到一个线程类,new一个实例出来,这个生成的线程就进入了初始状态。

该线程没有被start()启动,但也不代表调用了start()状态就立即改变状态,中间还有一些步骤,如果在这个启动的过程中有另一个线程来获取它的状态,其实是不确定的,要看那些中间步骤是否已经完成了。

2. 运行状态

  • 就绪状态

    包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在运行,也可能正在等待系统资源,如等待CPU为它分配时间片。就绪状态有资格运行,但是要等到调度程序选到,不选到永远都是就绪状态。

    进入就绪状态的几种方式:

    1. 新建的线程调用start()方法进入就绪状态。
    2. 运行中线程时间片用完了,调用该线程的yield()方法进入就绪状态。
    3. 等待锁资源的线程拿到对象锁后进入就绪状态。
    4. 当前线程sleep()结束、其他线程join()结束、等待用户输入完毕、某个线程拿到对象锁,这些线程也将进入就绪状态。
  • 运行中状态

    线程调度程序从可运行线程池中选择一个线程作为当前线程时,该线程所处的状态。

3. 阻塞状态

线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。

4. 等待状态

线程需要等待其他线程做通知或中断,如果没有就要一直等待下去。

比如:
Thread1获取lock对象锁,之后调用wait()方法进入等待队列,而同时会释放掉对象锁,状态为Waiting。
Thread2获取lock对象锁后调用notify()方法通知一个等待线程,将其移到同步队列,然后继续执行自己Synchronized中的代码,当释放掉lock对象锁后,Thread1线程才有可能重新获取lock并执行先前未完成的代码(是否通知了Thread1要看线程调度器有没有选择Thread1)。

阻塞与等待的区别:

  1. 阻塞状态是等待着获取到一个排他锁,进入阻塞状态都是被动的,离开阻塞状态是因为其它线程释放了锁,不阻塞了。
  2. 等待状态是在等待一段时间或者某个唤醒动作的发生,进入等待状态是主动的。

5. 超时等待

与等待类似,但可以在指定的时间内自行返回。

6. 终止状态

  1. 当线程的run()方法完成时或主线程的main()方法完成时,我们就认为该线程终止了。这个线程对象也许是活的,但它不是一个线程。
  2. 线程一旦终止就不能复生。在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

参考

《Java多线程编程核心技术》 高洪岩
Java线程的6种状态及切换(透彻讲解)
Java语言定义的线程状态分析

Java 线程的6种状态(简单介绍)相关推荐

  1. java 线程的几种状态(转载)

    java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...

  2. Java线程的6种状态

    线程的概念,以及线程的创建方式,见我之前写的博文 本篇文章主要讲Java线程的6种状态 6种状态:初始状态(new) .可运行状态(Runnable).运行状态(Running).阻塞状态(Block ...

  3. 详解Java线程的几种状态

    一言不合翻源码,一下就是Thread类源码中State内置枚举,列举出了Java线程的几种状态: /*** A thread state. A thread can be in one of the ...

  4. java线程的几种状态

    线程共有6种状态:NEW.RUNNABLE.BLOCKED.WAITING.TIMED_WAITING.TERMINATED.分别对应于:新建.运行.阻塞.等待.带超时的等待.终止. 1)新建状态(N ...

  5. java 线程的几种状态

    java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...

  6. Java线程的6种状态及切换(透彻讲解)

    Java中线程的状态分为6种. 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法. 2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running ...

  7. Java线程的5种状态及切换

    ava中的线程的生命周期大体可分为5种状态. 1. 新建(NEW):新创建了一个线程对象. 2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方 ...

  8. Java 线程的 5 种状态

    线程状态图: 线程共包括以下 5 种状态: 1. 新建状态(New): 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runna ...

  9. Java线程的6种状态(NEW,RUNNABLE,BLOCKED,WAITING,TINED_WATING,TEMINATE)

    1,NEW()新建 线程刚被创建,但未被启动.也就是没有调用start方法. 2,Runnable(可运行) 线程可以在java的虚拟机中运行的状态,可能正在运行自己的代码,也可能没有,这取决于cpu ...

最新文章

  1. Spring Boot 中的 @EnableAutoConfiguration 是如何处理的?
  2. Flutter从0基础到App上线
  3. 彻底理解C#中值类型和引用类型的区别
  4. texlive2015+texstudio
  5. Javascript非构造函数的继承
  6. ListBox之随手放个控件
  7. LeetCode--256. 粉刷房子(动态规划)
  8. 条件锁pthread_cond_t 的应用
  9. 文件管理英文html,Directory Opus
  10. springboot 使用restTemplate 发送https请求 忽略ssl证书
  11. 深入Redis持久化 1
  12. 刚大学毕业,学习的C++,到底能做什么?
  13. 从零基础入门Tensorflow2.0 ----三、10. 近似求导
  14. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_1_序列化和反序列化的概述...
  15. ADB Interface显示黄色惊叹号怎么办?
  16. 学Java看什么视频好呢?视频经验大总结
  17. 华为设备MAC地址配置命令
  18. wd移动硬盘测试软件,西数硬盘修复工具(WD HDD Repair Tools)
  19. Allegro PCB多层板中负片热风焊盘的制作以及flash的添加
  20. W3C CSS验证方法

热门文章

  1. 从零开始打造专属钉钉机器人
  2. Ubuntu修改分辨率
  3. DS1302LCD1602显示
  4. 笔记本电脑电池充电技巧
  5. java tlv解析_java解析TLV格式数据 | 学步园
  6. VMware、linux虚拟机设置网络实现虚拟机与主机网络互通
  7. 饥荒云服务器存档在哪个文件夹,饥荒存档位置的位置在哪里?如何添加别人的存档?...
  8. ios 开发设置左滑退出_iOS 关闭系统左滑动返回
  9. 幂律分布现象-power-law
  10. Meshmixer_v3.0_Win64安装教程(附中文汉化版安装包下载地址)