JAVA线程六种状态_Java:线程的六种状态及转化
多线程概述及创建方式
Java:线程的六种状态及转化
关于线程的生命周期,网上书上说法不一,难以统一,本篇做一个总结:
java.lang.Thread.State枚举类中定义了六种线程的状态,可以调用线程Thread中的getState()方法获取当前线程的状态。
线程状态
解释
NEW
尚未启动的线程状态,即线程创建,还未调用start方法
RUNNABLE
就绪状态(调用start,等待调度)+正在运行
BLOCKED
等待监视器锁时,陷入阻塞状态
WAITING
等待状态的线程正在等待另一线程执行特定的操作(如notify)
TIMED_WAITING
具有指定等待时间的等待状态
TERMINATED
线程完成执行,终止状态
下图源自《Java并发编程艺术》图4-1
一、新建状态(NEW)
即用new关键字新建一个线程,这个线程就处于新建状态。
二、运行状态(RUNNABLE)
操作系统中的就绪和运行两种状态,在Java中统称为RUNNABLE。
就绪状态(READY)
当线程对象调用了start()方法之后,线程处于就绪状态,就绪意味着该线程可以执行,但具体啥时候执行将取决于JVM里线程调度器的调度。
It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution.
不允许对一个线程多次使用start。
线程执行完成之后,不能试图用start将其唤醒。
其他状态 ->就绪
线程调用start(),新建状态转化为就绪状态。
线程sleep(long)时间到,等待状态转化为就绪状态。
阻塞式IO操作结果返回,线程变为就绪状态。
其他线程调用join()方法,结束之后转化为就绪状态。
线程对象拿到对象锁之后,也会进入就绪状态。
运行状态(RUNNING)
处于就绪状态的线程获得了CPU之后,真正开始执行run()方法的线程执行体时,意味着该线程就已经处于运行状态。需要注意的是,对于单处理器,一个时刻只能有一个线程处于运行状态。
对于抢占式策略的系统来说,系统会给每个线程一小段时间处理各自的任务。时间用完之后,系统负责夺回线程占用的资源。下一段时间里,系统会根据一定规则,再次进行调度。
运行状态转变为就绪状态的情形:
线程失去处理器资源。线程不一定完整执行的,执行到一半,说不定就被别的线程抢走了。
调用yield()静态方法,暂时暂停当前线程,让系统的线程调度器重新调度一次,它自己完全有可能再次运行。
yield方法的官方解释:
A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore this hint.
提示调度程序,当前线程愿意放弃当前对处理器的使用。这时,当前线程将会被置为就绪状态,和其他线程一样等待调度,这时候根据不同优先级决定的概率,当前线程完全有可能再次抢到处理器资源。
三、阻塞状态(BLOCKED)
阻塞状态表示线程正等待监视器锁,而陷入的状态。
以下场景线程将会阻塞:
线程等待进入synchronized同步方法。
线程等待进入synchronized同步代码块。
线程取得锁,就会从阻塞状态转变为就绪状态。
四、等待状态(WAITING)
进入该状态表示当前线程需要等待其他线程做出一些的特定的动作(通知或中断)。
运行->等待
当前线程运行过程中,其他线程调用join方法,当前线程将会进入等待状态。
当前线程对象调用wait()方法。
-LockSupport.park():出于线程调度的目的禁用当前线程。
等待->就绪
等待的线程被其他线程对象唤醒,notify()和notifyAll()。
LockSupport.unpark(Thread),与上面park方法对应,给出许可证,解除等待状态。
五、超时等待状态(TIMED_WAITING)
区别于WAITING,它可以在指定的时间自行返回。
运行->超时等待
调用静态方法,Thread.sleep(long)
线程对象调用wait(long)方法
其他线程调用指定时间的join(long)。
LockSupport.parkNanos()。
LockSupport.parkUntil()。
补充:
sleep和yield的不同之处:
sleep(long)方法会使线程转入超时等待状态,时间到了之后才会转入就绪状态。而yield()方法不会将线程转入等待,而是强制线程进入就绪状态。
使用sleep(long)方法需要处理异常,而yield()不用。
超时等待->就绪
同样的,等待的线程被其他线程对象唤醒,notify()和notifyAll()。
LockSupport.unpark(Thread)。
六、消亡状态
即线程的终止,表示线程已经执行完毕。前面已经说了,已经消亡的线程不能通过start再次唤醒。
run()和call()线程执行体中顺利执行完毕,线程正常终止。
线程抛出一个没有捕获的Exception或Error。
需要注意的是:主线成和子线程互不影响,子线程并不会因为主线程结束就结束。
许多地方仍需后期补充,敬请期待。
参考资料:《JAVA并发编程实践》、《疯狂Java讲义》、《Java并发编程艺术》
JAVA线程六种状态_Java:线程的六种状态及转化相关推荐
- java 线程状态_JAVA线程漫谈:线程状态与状态转换解析
线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...
- java 线程状态_Java线程为何没有Running状态?我猜你不知道。
作者:国栋原文:https://my.oschina.net/goldenshaw/blog/705397 Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言, ...
- java线程池返回线程状态_Java线程的不同状态
java线程池返回线程状态 介绍 在Java中,线程可以具有状态. Thread.State枚举定义Java线程可以具有的不同状态. 该枚举定义了以下值– 新 可运行 已封锁 等候 TIMED_WAI ...
- java 线程的函数_Java线程总结
三. 线程间的通信 1. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种: 1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行.如通过new产 ...
- java 同步转并行_Java线程与并行编程(二)
你好,我是goldsunC 让我们一起进步吧! 线程的控制与同步 线程的状态与生命周期 '每个Java程序都有一个默认的主线程,想要实现多线程,必须在主线程中创建新的线程对象.新建的线程在它的一个完整 ...
- java方法生命周期_Java线程的第二种实现方式以及生命周期
上篇中我们了解了Java线程的第一种实现方式,主要分两步,第一步是继承java.lang.Thread; 第二步是重写run()方法.接下来我们来看Java线程的第二种实现方式,也是分为两步,第一步, ...
- java io密集型任务_Java线程池讲解——针对IO密集型任务
sap java开发技术详解&mdash基础 94.01元 (需用券) 去购买 > 针对 IO 密集型的任务,我们可以针对原本的线程池做一些改造,从而可以提高任务的处理效率. 基本 在阿 ...
- 线程打印状态_Java线程状态的转换
根据上面关于线程状态的介绍我们可以得到下面的线程状态转换图: BLOCKED与RUNNABLE状态的转换 我们在上面说到:处于BLOCKED状态的线程是因为在等待锁的释放.假如这里有两个线程a和b, ...
- java线程锁标记_java 线程 中断标志位
课程素材来自 http://enjoy.ke.qq.com/ 版权所有 java线程中,线程中断方法详解: 线程自然终止:自然执行完或抛出未处理异常 stop(),resume(),suspen ...
- java线程详解_Java线程详解
程序.进程.线程的概念程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是正在运行的一个程序.动 ...
最新文章
- stm32 堆和栈(stm32 Heap Stack)
- [NHibernate]基本配置与测试
- SpeedTree导入到虚幻UE4的注意事项
- slice的部分说明
- (char*)malloc(sizeof(char))有什么用,为什么要这么写——简单介绍指针
- 自营型电商和平台型电商的行业秘密是什么?
- Shell 自定义函数
- tabel表格制作及操作
- 例行性工作 排程(crontab)
- win7关机快捷键_win7电脑键盘关机的操作方法
- 怎么知道自己适不适合学计算机专业,不知道自己到底适不适合学习计算机专业...
- ATHK弄出个有道词典加入生词本的快接键...
- Linux的history命令
- 哨兵二号数据下载的手把手指导以及12.5米DEM数据下载
- java 信号处理模块_GitHub - Astoros-Fung/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...
- LeetCode 707. Design Linked List
- 一起avi文件播放时没有图像问题的解决(tscc.exe)
- 联想win8系统改成win7系统教程,win8系统如何装回win7
- [HTML]解决html5中设置的颜色和浏览器显示的颜色不一致的问题
- LOJ #109. 并查集
热门文章
- R计算回归模型Mallows’ Cp指标
- 机器学习的数据类型有哪几种?每种数据类型对应的操作有哪些?为什么?
- 白化(whitening)是什么?白化(whitening)与PCA(principle component analysis)的区别是什么?
- R语言数据结构之列表
- 我国计算机通信技术现状及未来的发展趋势,我国计算机通信技术现状及未来的发展趋势...
- mysql text index_MySQL 全文索引(fulltext index)
- NGS的测序仪和相关技术时间轴 NGS相关数据库和项目时间轴
- Hybrid error correction and de novo assembly of single-molecule sequencing reads
- 短序比对工具 bowtie vs BWA vs Subread vs SOAP vs NovoAlign
- 人脸对齐--Face Alignment at 3000 FPS via Regressing Local Binary Features