多线程概述及创建方式

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:线程的六种状态及转化相关推荐

  1. java 线程状态_JAVA线程漫谈:线程状态与状态转换解析

    线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...

  2. java 线程状态_Java线程为何没有Running状态?我猜你不知道。

    作者:国栋原文:https://my.oschina.net/goldenshaw/blog/705397 Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言, ...

  3. java线程池返回线程状态_Java线程的不同状态

    java线程池返回线程状态 介绍 在Java中,线程可以具有状态. Thread.State枚举定义Java线程可以具有的不同状态. 该枚举定义了以下值– 新 可运行 已封锁 等候 TIMED_WAI ...

  4. java 线程的函数_Java线程总结

    三.    线程间的通信 1.    线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种: 1)    产生(New):线程对象已经产生,但尚未被启动,所以无法执行.如通过new产 ...

  5. java 同步转并行_Java线程与并行编程(二)

    你好,我是goldsunC 让我们一起进步吧! 线程的控制与同步 线程的状态与生命周期 '每个Java程序都有一个默认的主线程,想要实现多线程,必须在主线程中创建新的线程对象.新建的线程在它的一个完整 ...

  6. java方法生命周期_Java线程的第二种实现方式以及生命周期

    上篇中我们了解了Java线程的第一种实现方式,主要分两步,第一步是继承java.lang.Thread; 第二步是重写run()方法.接下来我们来看Java线程的第二种实现方式,也是分为两步,第一步, ...

  7. java io密集型任务_Java线程池讲解——针对IO密集型任务

    sap java开发技术详解&mdash基础 94.01元 (需用券) 去购买 > 针对 IO 密集型的任务,我们可以针对原本的线程池做一些改造,从而可以提高任务的处理效率. 基本 在阿 ...

  8. 线程打印状态_Java线程状态的转换

    根据上面关于线程状态的介绍我们可以得到下面的线程状态转换图: BLOCKED与RUNNABLE状态的转换 我们在上面说到:处于BLOCKED状态的线程是因为在等待锁的释放.假如这里有两个线程a和b, ...

  9. java线程锁标记_java 线程 中断标志位

    课程素材来自 http://enjoy.ke.qq.com/    版权所有 java线程中,线程中断方法详解: 线程自然终止:自然执行完或抛出未处理异常 stop(),resume(),suspen ...

  10. java线程详解_Java线程详解

    程序.进程.线程的概念程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是正在运行的一个程序.动 ...

最新文章

  1. stm32 堆和栈(stm32 Heap Stack)
  2. [NHibernate]基本配置与测试
  3. SpeedTree导入到虚幻UE4的注意事项
  4. slice的部分说明
  5. (char*)malloc(sizeof(char))有什么用,为什么要这么写——简单介绍指针
  6. 自营型电商和平台型电商的行业秘密是什么?
  7. Shell 自定义函数
  8. tabel表格制作及操作
  9. 例行性工作 排程(crontab)
  10. win7关机快捷键_win7电脑键盘关机的操作方法
  11. 怎么知道自己适不适合学计算机专业,不知道自己到底适不适合学习计算机专业...
  12. ATHK弄出个有道词典加入生词本的快接键...
  13. Linux的history命令
  14. 哨兵二号数据下载的手把手指导以及12.5米DEM数据下载
  15. java 信号处理模块_GitHub - Astoros-Fung/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...
  16. LeetCode 707. Design Linked List
  17. 一起avi文件播放时没有图像问题的解决(tscc.exe)
  18. 联想win8系统改成win7系统教程,win8系统如何装回win7
  19. [HTML]解决html5中设置的颜色和浏览器显示的颜色不一致的问题
  20. LOJ #109. 并查集

热门文章

  1. R计算回归模型Mallows’ Cp指标
  2. 机器学习的数据类型有哪几种?每种数据类型对应的操作有哪些?为什么?
  3. 白化(whitening)是什么?白化(whitening)与PCA(principle component analysis)的区别是什么?
  4. R语言数据结构之列表
  5. 我国计算机通信技术现状及未来的发展趋势,我国计算机通信技术现状及未来的发展趋势...
  6. mysql text index_MySQL 全文索引(fulltext index)
  7. NGS的测序仪和相关技术时间轴 NGS相关数据库和项目时间轴
  8. Hybrid error correction and de novo assembly of single-molecule sequencing reads
  9. 短序比对工具 bowtie vs BWA vs Subread vs SOAP vs NovoAlign
  10. 人脸对齐--Face Alignment at 3000 FPS via Regressing Local Binary Features