Java线程生命周期及常用方法说明
2021/6/13 20:21:17
本文主要是介绍Java线程生命周期及常用方法说明,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、Java线程的生命周期——6大状态
Java线程从创建到销毁,一共经历6个状态(不一定每一种状态都经历):
NEW:初始状态,线程被构建,但是还没有调用start方法
RUNNABLED:运行状态,JAVA线程把操作系统中的就绪和运行两种状态统一称为“运行中”
BLOCKED:阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃了CPU使用权,阻塞也分为几种情况
WAITING:等待状态
TIME_WAITING:超时等待状态,超时以后自动返回
TERMINATED:终止状态,表示当前线程执行完毕
Java线程从创建到销毁,一共经历6个状态(不一定每一种状态都经历):
sleep和wait/notify机制, 线程阻塞和等待的区别
sleep()方法
sleep()方法是Thread类的方法,通过其定义可知是个native方法,在指定的时间内(精度取决于CPU)线程进入TIMED_WAITING状态阻塞执行。而且从其注释中可知,并不会失去对任何监视器(monitors)的所有权,也就是说不会释放锁,仅仅会让出cpu的执行权。如下图所示
调用sleep方法后,线程进入的是TIMED_WAITING状态。Javadoc也说了,调用Thread.sleep方法后,就会进入TIMED_WAITING状态(Linux中是S状态):
同时,Javadoc也说明,只有在等待监视器锁(Monitor lock)时,才会进入BLOCKED状态(Linux中也是S状态):
wait()方法
wait/notify机制
wait()方式是基类Object的方法,其实也是个native方法
不管是wait()还是wait(long timeout, int nanos),其调用的都是wait(long timeout)
The current thread must own this object's monitor
根据注释中的一句话,可以看出此方法调用的前提是当前线程已经获取了对象监视器monitor的所有权。
该方法会调用后不仅会让出cpu的执行权,还会释放锁(即monitor的所有权),并且进入wait set中,知道其他线程调用notify()或者notifyall()方法,或者指定的timeout到了,才会从wait set中出来,并重新竞争锁。
区别
最主要的区别就是释放锁(monitor的所有权)与否,但是两个方法都会抛出InterruptedException。
这篇关于Java线程生命周期及常用方法说明的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14后台交互资料入门指南
- 2024-11-14如何轻松创建项目环境:新手入门教程
- 2024-11-14如何抽离公共代码:初级开发者指南
- 2024-11-14Python编程入门指南
- 2024-11-14Python编程入门:如何获取参数
- 2024-11-14JWT 用户校验:简单教程与实践
- 2024-11-14Pre-commit 自动化测试入门指南
- 2024-11-14Python编程基础
- 2024-11-14Server Action入门教程:轻松掌握服务器操作
- 2024-11-14Server Component入门教程:轻松搭建服务器组件