java多线程的几种状态

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线程停止的几种方法

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值