线程的状态及状态转换
线程的状态及状态转换
线程状态
jdk中提供了线程的状态。在Thread类中提供了一个内部的枚举类:State
public enum State{NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAIYING,TERMINATED;}
新建状态(NEW)
用new语句创建的线程处于新建状态,此时和其他对象一样,在堆中仅仅给他分配了内存。
就绪状态(RUNNABLE)
当一个线程创建后,调用了start方法,线程状态就进入到就绪状态,处于就绪状态的线程意味着所有需要的资源已经装备就绪,等待CPU的调用,CPU的调度是由操作系统控制的,用户无法操控。
运行状态(RUNNING)
处于运行状态的线程占用CPU资源,执行程序代码,只有处于就绪状态的线程才能有机会进入到运行状态。
1.如果一个时间片用完或者调用yield方法,线程会从运行状态进入到就绪状态。
2.如果线程已经执行结束了,线程会从运行状态进入终止状态。
3.如果线程执行过程中会因为等待一些资源而进入阻塞状态(WAITING,TIME_WAITTING,BLOCKED)。
阻塞状态(BLOCKED)
进入这种阻塞状态的原因可以是:线程期望进入同步方法或者同步代码块(Synchronized),尚未获取到锁资源的情况下,可以从运行状态进入到CLOCKED状态。
等待状态(WAITING)
如果调用wait方法,就进入到WAITING状态,即调用wait()会触发线程从运行状态进入到阻塞状态而无法执行,直到其他线程发出notify或notifyAll这个方法,此时线程才会从WAITING状态进入到BLOCKED状态,进而进入就绪状态。
睡眠等待(TIME_WAITING)
如果线程调用sleep(long)、join(long)、wait(long)等方法时,会触发线程进入到TIME_WAITING状态,即指定了阻塞的时间,到达了给定的时间后就可以继续进入就绪状态等待CPU的调度。
终止状态(TERMINATED)
当线程退出run()方法时,线程就进入了终止状态,该状态是结束线程的生命周期。
状态转换
一个线程的生命周期中需要的状态:NEW、RUNNABLE、RUNNING、TERMINING四个状态,当线程需要响应特定资源时,进入到阻塞状态:BLOCKED、WATING、TIME_WAITING状态。
线程方法
start()启动线程
start()方法作用是启动一个新线程,start()方法需要首先调用,start()方法不能被重复调用。
start()方法的实现是调用了一个native的方法,本质上Java创建的多线程其实是由有操作系统所提供的多线程方式来创建的。
start()方法启动子线程是通过调用系统提供的方法来启动线程。
run():子线程执行体
run()方法中是子线程的执行体
run()方法和普通的成员方法一样,可以被重复调用,如果在当前线程调用执行run()方法,是不会启动新线程。
yield():线程让步
是暂停当前的线程,并让步于其他同优先级或更高优先级的线程先执行
yield方法是定义在Thread类下的静态方法。
sleep():线程睡眠
是让线程休眠,而且是哪个线程调用,就是哪个线程休眠。
sleep()方法是Thread类下的静态方法,刚方法执行过程中会抛出interruptedException异常,即可以终止异常。
sleep()所在的线程休眠期间,线程会释放掉CPU资源给其他线程,但如果当前线程本身有锁,锁是不会释放的。
线程会由“RUNNING”状态进入到TIMED_WAITING状态,当到达休眠状态时间或者是被中断掉休眠,就会从睡眠状态进入到就绪状态,从而等待CPU的调用。
方法:
sleep(long millis)
sleep(long millis,int nanos)
这两个方法是Thread类的静态方法,不属于某个对象。
join():线程同步
暂停当前线程,等待子线程的执行,也称之为线程合并,join方法特点将并行执行。
例如:如果在ta线程中调用tb.join(),则让ta线程停止运行,并让tb线程先执行,直到tb线程执行完毕,ta线程才能继续执行。
线程的状态及状态转换相关推荐
- java 线程状态_JAVA线程漫谈:线程状态与状态转换解析
线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...
- 线程池有哪些状态?状态是如何转换的?
在 Java 中,线程池的状态和线程的状态是完全不同的,线程有 6 种状态:NEW:初始化状态.RUNNABLE:可运行/运行状态.BLOCKED:阻塞状态.WAITING:无时限等待状态.TIMED ...
- 线程的几种状态和状态之间的转换
线程的六种状态 线程的生命周期主要有以下六种 New(新创建) Runnable(可运行) Blocked(被阻塞) Waiting(等待) Timed Waiting(计时等待) Terminate ...
- 线程的几种状态极其转换
线程的几种状态极其转换 线程在一定条件下,状态会发生变化.线程一共有以下几种状态: 1.初始化状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该 ...
- java线程的状态及状态间的切换
在 Java 5 以后,线程状态被明确定义在其公共内部枚举类型 java.lang.Thread.State 中. 分别是: 1. NEW(初始化状态) 2. RUNNAB ...
- Java线程的生命周期及线程的几种状态
线程也具有生命周期,主要包括 7 种状态: 出生状态. 就绪状态. 运行状态. 等待状态. 休眠状态. 阻塞状态. 死亡状态, 下面对线程生命周期中的 7 种状态做说明. 出生状态:用户在创建线程时所 ...
- c++thread里暂停线程_Java线程的 6 种状态
作者:( •̀ ω •́ )y 出处:https://www.cnblogs.com/laishenghao/p/13972421.html 一.线程状态的枚举 Java的线程从创建到销毁总共有6种状 ...
- python线程状态_python 线程的五个状态
当程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程. 那么,CPU 在轮换执行线程的过程中,即从创建到消亡的整个过程,可能会历经 5 种状态,分别是新建.就绪.运行.阻塞和 ...
- 正在中止线程 iis_Zephyr线程生命周期及状态
Zephyr中线程是使用CPU的最小单位,线程从创建后由zephyr内核进行调度,根据运行和等待资源的状况在几个状态中切换,直到线程终止退出生命周期. 线程状态 线程在其生命周期中有下面6种状态: N ...
- Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。...
java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待) ...
最新文章
- Web测试需要了解的知识
- 用偷梁换柱法清除腾讯QQ迷你首页的方法
- C# 移动鼠标方法
- jetson nano 人脸
- 如何替换 Ubuntu 11.10 登录屏幕背景和logo
- c语言实验题——字符串排序,C语言中实现“三个数由小到大排序”的多种方法浅析...
- ICCV 2019 | 港大提出视频显著物体检测算法MGA,大幅提升分割精度
- ie型lfsr_什么是PRBS
- 不错的 HttpHelper类 c#
- Python常用数据库封装方法
- 最强社工必备查询网址汇总
- 嵌入式开发与单片机开发有什么区别
- 概率论与计算机的关系小论文,概率论与数理统计论文
- 64位计算机比32快多少,电脑系统应该选择64位还是32位 到底哪个速度更快?
- ALCO单螺母SN系列面板安装球阀
- 蓝桥杯算法竞赛培训(二) 汉诺塔与STL
- Typora+picgo+gitee图片外链失效,Typora历史笔记无法显示图片
- 虚拟空间、vps、管理型服务器和独立主机之间那些事儿
- 邮政储蓄银行厦门分行经营管理系统 项目总结
- 北京市重点区域5G网络实测分析