Java多线程开发系列之三:线程这一辈子(线程的生命周期)
来源:互联网 发布:网络红歌还钱歌 编辑:程序博客网 时间:2024/06/05 04:22
前文中已经提到了,关于多线程的基础知识和多线程的创建。但是如果想要很好的管理多线程,一定要对线程的生命周期有一个整体概念。本节即对线程的一生进行介绍,让大家对线程的各个时段的状态有一定了解。
线程的一生的状态过程
如下图:
线程会由出生 到运行 再到 死亡。在前文中曾经讲到过(寻找前文请点这里):java中各个线程是抢占式的:cpu一般不会为一个线程从出生一直服务到老,各个线程总是争抢的希望得到cpu的“青睐”。当某个线程发生阻塞时,那么cpu就会被其他线程迅速抢占。而当前阻塞的线程只能变为就绪状态,等待cpu下次的“垂青”。这里有句老话挺符合的:机会总是留给有准备的人的(当前处于就绪状态的),如果你还没准备好(阻塞),机会就转瞬即逝了(转向其他线程了)。
所以如上图所示:
线程在出生后(被new出来以后)即为新建状态,此时jvm会为其分配内存、初始化字段,仅此。然后进入就绪状态(执行Start方法)开始排队,紧接着当cpu开始执行(抢占到资源)该线程,线程进入运行状态,接着由于某种原因需要等待(如睡眠,等待需要调用的资源(如被其它资源占用,或者开启需要准备时间))而被迫进入阻塞状态。待等待结束后(睡眠时间到后、等待资源被释放)线程会再次进入就绪状态,等待着cpu的再次垂青。于此同时如果运行状态中的线程由于cpu调度的问题,而失去运行权利后也会被变为就绪状态,等待cpu的再次降临。当运行中的线程执行完线程体中的任务后、或者由于某种异常而挂起后,该线程就会进入死亡状态。
状态跳转详解:
在上图中各个步骤(途中数字)代表的情况
①新建New---->就绪Runnable运行Start()方法②就绪Runnable---->运行Running获得cpu资源③运行Running---->阻塞Blocked
进入睡眠、
被挂起、
等待其他资源、
等待某个通知(后文会讲到)、
等待某个IO资源
④阻塞Blocked---->就绪Runnable睡眠时间到、
挂起后被重新恢复、
等待资源已经被释放、
获取到其他线程的通知(后文会讲到)、
IO方法已经返回
⑤运行Running---->就绪Runnable处理器放弃当前线程,处理其他线程去了
⑥运行Running---->死亡Dead当前线程的执行体已经被运行结束、
当前线程抛出了无法解决的异常或错误
其它一些需要注意的地方:
(1)线程启动后,并不会立刻运行,具体运行时间要看虚拟机的调度(前文中有讲)
(2)线程一旦死亡就不能再重新启动就绪(使用Start方法),如果强制启动会抛出异常。
(3)想判断当前的线程是否已经被启动并且还未死亡(就绪、运行、阻塞),可以使用isAlive()方法判断
(4)启动线程进入就绪状态请务必使用Start()方法启动,而非Run方法,原因在创建多线程时也曾经讲过。
(5)线程一旦启动,大家都是独立的处理,并不会因为父线程(创建并启动子线程的线程)出现某种状态,而影响到自身(如父线程死亡后,子线程仍然会继续运行)。
原文地址:http://www.cnblogs.com/jilodream/p/4285094.html#3134707
0 0
- Java多线程开发系列之三:线程这一辈子(线程的生命周期)
- Java + 线程系列之线程的生命周期(三)
- Java 之 线程的生命周期(三)
- Java 多线程(三) 线程的生命周期及优先级
- Java多线程(三)——线程的生命周期
- Java 多线程(三)——线程的生命周期
- Java 多线程(三) 线程的生命周期及优先级
- Java 多线程(三) 线程的生命周期及优先级
- Java 多线程(三) 线程的生命周期及优先级
- Java 多线程(三)——线程的生命周期
- java多线程之线程的生命周期
- Java多线程系列(三)-----线程池
- java多线程(三)、线程的生命周期(状态)和线程的操作
- Java多线程开发系列之四:玩转多线程(线程的控制2)
- Java多线程开发系列之四:玩转多线程(线程的控制1)
- Java多线程开发系列之四:玩转多线程(线程的控制2)
- Java多线程开发系列之四:玩转多线程(线程的控制1)
- Java多线程-线程的生命周期
- Android Studio系列教程五--Gradle命令详解与导入第三方包
- atoi() 与 itoa()函数的内部实现
- Java多线程开发系列之四:玩转多线程(线程的控制1)
- LeetCode[String]: Valid Number
- 利用Joomla Google地图插件进行的反射DDoS攻击
- Java多线程开发系列之三:线程这一辈子(线程的生命周期)
- 五大常用算法
- 使用SQL查询所有数据库名和表名
- 工作流初识
- Java多线程开发系列之二:如何创建多线程
- VS2010/MFC 按钮控件添加bmp图片背景
- 使用python获取mongodb一段时间的数据
- 37条运营者必知的APP运营秘籍
- java_main函数规则一二