线程的生命周期及五种基本状态

关于Java中线程的生命周期,首先看一下下面这张较为经典的图:

新建(new Thread)

当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。例如:Thread t1=new Thread();

就绪(runnable)

调用Thread类的start方法,线程已经被启动,进入就绪状态,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。

运行(running)

线程获得CPU资源正在执行任务(执行run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束或者时间片结束。

堵塞(blocked)

由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。阻塞结束后线程进入就绪状态。

堵塞的情况分三种:

(一)等待堵塞:执行的线程执行wait()方法,JVM会把该线程放入等待池中。

(二)同步堵塞:执行的线程在获取对象的同步锁时,若该同步锁被别的线程占用。则JVM会把该线程放入锁池中。

(三)其它堵塞:执行的线程执行sleep()或join()方法,或者发出了I/O请求时。JVM会把该线程置为堵塞状态。

当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完成时。线程又一次转入就绪状态。

死亡(dead)

当线程执行完毕(run方法运行结束)或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。

线程间的状态转换

解释:

1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但无论如何,当我们new了这个对象后。线程就进入了初始状态;

2、当该对象调用了start()方法,就进入可执行状态; 3、进入可执行状态后,当该对象被操作系统选中。获得CPU时间片就会进入执行状态;

4、进入执行状态后情况就比較复杂了

4.1、run()方法或main()方法结束后,线程就进入终止状态;

4.2、当线程调用了自身的sleep()方法或其它线程的join()方法,就会进入堵塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后。该线程进入可执行状态,继续等待OS分配时间片;

4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可执行状态,这时与其它进程处于同等竞争状态,OS有可能会接着又让这个进程进入执行状态。

4.4、当线程刚进入可执行状态(注意,还没执行),发现将要调用的资源被synchroniza(同步),获取不到锁标记。将会马上进入锁池状态,等待获取锁标记(这时的锁池里或许已经有了其它线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可执行状态。等待OS分配CPU时间片。

4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的全部资源,与堵塞状态不同)。进入这个状态后。是不能自己主动唤醒的,必须依靠其它线程调用notify()或notifyAll()方法才干被唤醒(因为notify()仅仅是唤醒一个线程,但我们由不能确定详细唤醒的是哪一个线程。或许我们须要唤醒的线程不可以被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池。等待获取锁标记。

一个线程会因为以下原因而放弃CPU:

时间片用完了,java虚拟机让当前线程暂时放弃CPU,转到就绪状态,使其它线程获得运行机会。

当前线程因为某些原因而进入阻塞状态

线程结束运行

线程在以下情况会停止:

run方法正常执行完毕

run方法执行过程中抛出一个未捕获的异常

调用stop方法(不推荐使用)

进程的停止,当一个进程中所有的前台线程停止后,该进程结束。

如果希望明确地让一个线程给另外一个线程运行的机会,可以采取以下办法。

1. 调整各个线程的优先级

2. 让处于运行状态的线程调用Thread.sleep()方法

3. 让处于运行状态的线程调用Thread.yield()方法

4. 让处于运行状态的线程调用另一个线程的join()方法

java 线程僵死_线程的生命周期?什么时候会出现僵死进程?相关推荐

  1. java future 线程 状态_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  2. java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  3. 线程生命周期 什么时候会出现僵死进程

    线程生命周期 wait方法会释放锁,sleep不会释放锁. 在线程t中调用t2.join(),线程t进入阻塞状态直到线程t2执行完毕. Thread.yield()线程主动放弃cpu使用权. 什么时候 ...

  4. 【笔记】【一文搞定】java - 多线程:内存模型、生命周期、方法/关键词、并发问题、线程池、案例

    参考: Java内存模型(JMM)详解 - https://zhuanlan.zhihu.com/p/518758482 线程安全性详解(原子性.可见性.有序性) - https://blog.csd ...

  5. Java并发篇_线程详解

    线程(thread) 是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 ...

  6. java阻塞线程池_线程池解决阻塞方法

    一.序言 当我们需要使用线程的时候,我们可以新建一个线程,然后显式调用线程的start()方法,这样实现起来非常简便,但在某些场景下存在缺陷:如果需要同时执行多个任务(即并发的线程数量很多),频繁地创 ...

  7. JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器

    文章目录 Pre 运行时数据区总览 线程栈 概要 栈内部主要组成部分 局部变量 操作数栈 动态链接 方法出口 小结 程序计数器 本地方法栈 附 测试demo javap JVM字节码指令集手册 Pre ...

  8. java synoch 加锁_线程间通信 - HappyCowboy - 博客园

    线程之间需要一些协调通信,来共同完成一件任务.Java多线程中,线程之间通信最常用的两个方法是wait()与notify() 使用wait()与notify()实现线程间的通信,需注意: ①wait( ...

  9. java 动态线程池_线程池的参数动态调整

    经典面试题 这次的文章还是绕回了我写的第三篇原创文章<有的线程它死了,于是它变成一道面试题>中留下的几个问题: 哎,兜兜转转,走走停停.天道好轮回,苍天饶过谁? 在这篇文章中我主要回答上面 ...

最新文章

  1. 皮一皮:别人都那么努力,你还有什么理由不努力...
  2. SVA Function Coverage
  3. php光标添加,JS在可编辑的div中的光标位置插入内容的方法_javascript技巧
  4. Unet项目解析(5): 数据封装、数据加载、数据显示
  5. iOS开发之如何跳到系统设置里的各种设置界面
  6. linux下日志管理系统,Linux管理日志系统详解
  7. CF1156D 0-1-Tree(换根DP)
  8. java货物进销管理系统_java实验 货物进销管理系统
  9. 如何创建xsl文件 xml_EXCEL知识分享 I 连载如何快速创建XML文件
  10. java自定义日志_java-自定义日志记录以在运行时收集消息
  11. Xposed框架安装、使用及插件开发
  12. 油猴脚本(tampermonkey):百度网盘搜索引擎聚合
  13. LT8618SX寄存器配置
  14. XtraReport显示行序号
  15. Double转BigDecimal并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary
  16. CSS 实现超过固定高度后出现展开折叠按钮
  17. 开发中使用到的sql总结
  18. Thinkpad 蓝牙键盘 Fn 键处于锁定状态的解决方法
  19. python系列——多线程之Semaphore信号量及
  20. 企微企鲸客SCRM管理系统可以为销售提供哪些辅助

热门文章

  1. 【代码质量管理开源平台】sonar的安装以及使用
  2. 字节跳动如何系统性治理 iOS 稳定性问题
  3. 指令集架构、arm内核、SoC、处理器、CPU、GPU等的关系
  4. 华为Mate X2+鸿蒙OS正在重构人、设备和场景的关系
  5. 常见的设计素材网站有哪些
  6. 【后端】10进制与进制转换以及斐波那契数列第N位的JAVA小练习
  7. submit禁止提交的几种方式
  8. html跟随鼠标代码,跟随鼠标特效代码
  9. 考研英语二真题文章重点单词
  10. tomcat配置缓存溢出异常