Java线程既可以创建,也可以销毁,所以线程是有生命周期的,而线程的生命周期就可以用线程的六种状态来描述。

从Thread类的源码中可以看出线程一共有6种状态:

这六种状态分别是:
1. New:初始状态,线程被创建,没有调用start()
2. Runnable:运行状态,Java线程把操作系统中的就绪和运行两种状态统一称为“运行中”
3. Blocked:阻塞,线程进入等待状态,线程因为某种原因,放弃了CPU的使用权
阻塞的几种情况:
A. 等待阻塞:运行的线程执行了wait(),JVM会把当前线程放入等待队列
B. 同步阻塞:运行的线程在获取对象的同步锁时,如果该同步锁被其他线程占用了,JVM会把当前线程放入锁池中
C. 其他阻塞:运行的线程执行sleep(),join()或者发出IO请求时,JVM会把当前线程设置为阻塞状态,当sleep()执行完,join()线程终止,IO处理完毕线程再次恢复
4. Waiting:等待状态
5. timed_waiting:超时等待状态,超时以后自动返回
6. terminated:终止状态,当前线程执行完毕

线程的六种状态之间的转换:
当实例化一个线程之后,首先进入初始状态,即New状态,此时线程在启动的时候并不是立刻就运行,而是要等到操作系统调度之后才运行,然后调用start()进入运行状态,即runnable,其中运行状态中包括运行(running)和就绪(ready)两种状态,这两种状态在操作系统的调度下可以互相转换,如果运行中的线程时间片被CPU抢占的话就会变成就绪状态;运行中的线程通过调用synchronized方法或synchronized块进入阻塞状态,即blocked,当线程获取到锁之后进入运行状态;如果线程在执行过程中调用了sleep(),wait().join(),Locksupported.parkUtil()等方法时,会进入等待状态(waiting)或超时等待状态,即timed_waiting,再次调用notify(),notifyAll(),Locksupported.unpark()等方法时,又会重新进入运行时状态,当线程执行完成时,就进入了终止状态,即terminated状态。
注:Locksupported是JDK 1.6提供的一个工具类,在java.util.concurrent包中,它所提供的park,unpark方法比wait,notify方法的灵活性更高。

通过命令行的方式查看线程状态
先介绍两个命令:
1. Jps:JDK 1.5提供的显示当前所有Java进程pid的命令,可以获取相应的进程pid
2. Jstack:是Java虚拟机自带的一种堆栈跟踪工具,他可以打印出给定的进程pid信息和远程调试服务的Java堆栈信息
具体操作步骤:
打开终端或命令行工具,输入jps命令,获取pid;
输入jstack pid,查看当前进程的信息。

上一篇:多线程的几种实现方式
下一篇:java线程停止的几种方法

java多线程的几种状态相关推荐

  1. Java 多线程的几种状态

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

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

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

  3. Java 线程的6种状态(简单介绍)

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

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

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

  5. Java线程的6种状态

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

  6. Java多线程的4种实现方式

    ** Java多线程的4种实现方式 ** 1:继承Thread并重写run方法,并调用start方法 /*** Java实现多线程的方式1* 继承Thread类,重写run方法* @author ho ...

  7. Java多线程的11种创建方式以及纠正网上流传很久的一个谬误

    创建线程比较传统的方式是继承Thread类和实现Runnable,也可以用内部类,Lambda表达式,线程池,FutureTask等. 经常面试会问到继承Thread类和实现Runnable的区别,然 ...

  8. java 线程的几种状态

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

  9. 实现java多线程的3种方式,99%人没用过第3种

    实现多线程的3种方式 1.继承Thread类 看jdk源码可以发现,Thread类其实是实现了Runnable接口的一个实例,继承Thread类后需要重写run方法并通过start方法启动线程. 继承 ...

最新文章

  1. 计算机图形学直线扫描转论文,计算机图形学实验报告-实验1直线段扫描转换.doc...
  2. jQuery获取json数据
  3. KindEditor上传的图片显示在jsp页面上时调整布局
  4. 工业级光纤收发器入网说明
  5. 快速获取csv数量_【数量技术宅|数据爬虫系列分享】如何获取免费的数字货币历史数据...
  6. linux将视频导入到iphone,如何将 IPhone 的文件导入 Linux
  7. 陈常青老师的讲座的笔记
  8. 图像处理-图像增强(二)
  9. 获取结构体某成员偏移
  10. linux pclint配置_静态分析工具PC-lint Plus使用教程:安装与配置
  11. 文件、异常、模块——初步了解
  12. 10- monkey日志分析
  13. zabbix监控nginx的状态
  14. PFC离散元与FLAC3D数值仿真核心技术与应用” 线上培训
  15. 全球及中国布鲁顿酪氨酸蛋白激酶抑制剂行业研究及十四五规划分析报告
  16. 树莓派41/100- Pico控制触摸开关模块TTP223
  17. Python 获取网站证书有效期
  18. [文摘20080131]89个管理定律及点评
  19. 阿里云云服务器ECS选购指南及省钱法宝
  20. 基于swiper使用vue-awesome-swiper 实现鼠标移入暂停自动播放、左右按钮控制前进后退、常见避坑、API中文文档地址

热门文章

  1. JRE System Library unbound
  2. unbound域名解析
  3. CKEditor和CKFinder整合实现上传下载功能
  4. MAC使用php7搭建LNMP环境
  5. 无盘读取服务器系统,无盘服务器系统
  6. for master
  7. cs231n作业环境配置
  8. OpenSSL漏洞介绍
  9. 人工智能、云计算等新技术加持北京2022冬奥会,为其增添色彩
  10. C++20 协程coroutine