java 线程僵死_线程的生命周期?什么时候会出现僵死进程?
线程的生命周期及五种基本状态
关于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 线程僵死_线程的生命周期?什么时候会出现僵死进程?相关推荐
- java future 线程 状态_手把手带你了解Java线程的实现方式及生命周期原理
前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...
- java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理
前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...
- 线程生命周期 什么时候会出现僵死进程
线程生命周期 wait方法会释放锁,sleep不会释放锁. 在线程t中调用t2.join(),线程t进入阻塞状态直到线程t2执行完毕. Thread.yield()线程主动放弃cpu使用权. 什么时候 ...
- 【笔记】【一文搞定】java - 多线程:内存模型、生命周期、方法/关键词、并发问题、线程池、案例
参考: Java内存模型(JMM)详解 - https://zhuanlan.zhihu.com/p/518758482 线程安全性详解(原子性.可见性.有序性) - https://blog.csd ...
- Java并发篇_线程详解
线程(thread) 是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 ...
- java阻塞线程池_线程池解决阻塞方法
一.序言 当我们需要使用线程的时候,我们可以新建一个线程,然后显式调用线程的start()方法,这样实现起来非常简便,但在某些场景下存在缺陷:如果需要同时执行多个任务(即并发的线程数量很多),频繁地创 ...
- JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器
文章目录 Pre 运行时数据区总览 线程栈 概要 栈内部主要组成部分 局部变量 操作数栈 动态链接 方法出口 小结 程序计数器 本地方法栈 附 测试demo javap JVM字节码指令集手册 Pre ...
- java synoch 加锁_线程间通信 - HappyCowboy - 博客园
线程之间需要一些协调通信,来共同完成一件任务.Java多线程中,线程之间通信最常用的两个方法是wait()与notify() 使用wait()与notify()实现线程间的通信,需注意: ①wait( ...
- java 动态线程池_线程池的参数动态调整
经典面试题 这次的文章还是绕回了我写的第三篇原创文章<有的线程它死了,于是它变成一道面试题>中留下的几个问题: 哎,兜兜转转,走走停停.天道好轮回,苍天饶过谁? 在这篇文章中我主要回答上面 ...
最新文章
- 皮一皮:别人都那么努力,你还有什么理由不努力...
- SVA Function Coverage
- php光标添加,JS在可编辑的div中的光标位置插入内容的方法_javascript技巧
- Unet项目解析(5): 数据封装、数据加载、数据显示
- iOS开发之如何跳到系统设置里的各种设置界面
- linux下日志管理系统,Linux管理日志系统详解
- CF1156D 0-1-Tree(换根DP)
- java货物进销管理系统_java实验 货物进销管理系统
- 如何创建xsl文件 xml_EXCEL知识分享 I 连载如何快速创建XML文件
- java自定义日志_java-自定义日志记录以在运行时收集消息
- Xposed框架安装、使用及插件开发
- 油猴脚本(tampermonkey):百度网盘搜索引擎聚合
- LT8618SX寄存器配置
- XtraReport显示行序号
- Double转BigDecimal并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary
- CSS 实现超过固定高度后出现展开折叠按钮
- 开发中使用到的sql总结
- Thinkpad 蓝牙键盘 Fn 键处于锁定状态的解决方法
- python系列——多线程之Semaphore信号量及
- 企微企鲸客SCRM管理系统可以为销售提供哪些辅助