Android(java)学习笔记5:线程的生命周期
1. 我们学习线程本质就是学习如何开始线程和终止线程。下面这个关于线程的生命周期图,要牢记:

新建状态:当程序使用new关键字创建了一个线程之后,该线程就处于新建状态。此时和其他Java对象一样,它仅仅有Java虚拟机为其分配内存,并初始化其成员变量的值。
就绪状态:当线程对象调用start()方法之后,该线程就处于就绪状态,Java虚拟机会为其创建方法调用栈 和 程序计数器,处于这个状态中的线程并没有开始运行,只是表示线程可以运行了。至于该线程何时可以开始运行,取决于JVM里线程调度器的调度。
运行状态:当处于就绪状态的线程获得CPU执行权,开始执行run()方法的线程执行体,则线程处于运行状态。
阻塞状态:线程在执行过程中暂停,以等待某个条件的触发。
死亡状态:线程结束。
线程会以如下三种方式结束,结束了就处于死亡状态.
- run()或者call()方法执行完成,线程正常结束。
- 线程抛出一个未捕获的Exception 或者 Error
- 直接调用该线程的stop()方法来结束该线程---该方法容易导致死锁,不推荐使用。
通常为了测试某个线程是否处于死亡状态,可以调用线程对象的方法isAlive(),当线程处于就绪、运行、阻塞三种状态时候,该方法将返回true;当线程处于新建、死亡两种状态的时候,该方法返回false。
完善上面的线程状态转换图,如下:

2. 线程运行 和 阻塞 深入理解:
当一个线程开始运行后,它不可能一直处于运行状态(除非它的线程执行体足够短,瞬间就执行结束了),线程在运行过程中需要被中断,目的是使其他线程获得执行的机会,线程调度的细节取决于底层平台所采用的策略。对于采用抢占式策略的系统而言,系统会给每个可执行的线程一个小时间段来处理任务;当该时间用完了,系统就会剥夺该线程所占用的资源,让其他线程获得执行的机会。在选择下一个线程的时候,系统会优先考虑线程优先级。
当发生如下情况的时候,线程会进入阻塞状态:
- 线程调用sleep()方法主动放弃所占用的处理器资源。
- 线程调用了一个阻塞式IO方法,在该方法返回之前,该线程阻塞。
- 线程试图获得一个同步监视器,但是该监视器正在被其他线程所持有。
- 线程正在等待某个通知(notify)
- 程序调用了线程的suspend()方法将该线程挂起。但是这个方法容易导致死锁,所以应该尽量避免使用该方法。
针对上面几种情况,当发生如下特定的情况时候可以解除上面的阻塞,让该线程重新进入就绪状态(注意是就绪状态不是运行状态):
- 调用sleep()方法的线程经过了指定时间。
- 线程调用的阻塞式IO方法已经返回。
- 线程成功地获得试图取得的同步监视器。
- 线程正在处于等待某个通知时候,其他线程发出了一个通知。
- 处于挂起状态的线程被调用了resume()恢复方法。
Android(java)学习笔记5:线程的生命周期的更多相关文章
- Java学习笔记之——线程的生命周期、线程同步
一. 线程的生命周期 新建(new Thrad):创建线程后,可以设置各个属性值,即启动前 设置 就绪(Runnable):已经启动,等待CPU调动 运行(Running):正在被CPU调度 阻塞(B ...
- 吴裕雄--天生自然java开发常用类库学习笔记:线程的生命周期
class MyThread implements Runnable{ private boolean flag = true ; // 定义标志位 public void run(){ int i ...
- mars android视频学习笔记一:Activity生命周期
(1)创建:onCreate->onStart->onResume;(2)失去焦点:onPause->onStop:(3)重新获得焦点:onRestart->onStart-& ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- java学习笔记之线程(Thread)
刚开始接触java多线程的时候,我觉得,应该像其他章节的内容一样,了解了生命周期.构造方法.方法.属性.使用的条件,就可以结束了,然而随着我的深入学习了解,我发现java的多线程是java的一个特别重 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- Java并发编程:线程的生命周期是个怎样的过程?
前言 在日常开发过程中,如果我们需要执行一些比较耗时的程序的话,一般来说都是开启一个新线程,把耗时的代码放在线程里,然后开启线程执行.但线程是会耗费系统资源的,如果有多个线程同时运行,互相之间抢占系统 ...
- Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗
在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...
- JAVA学习笔记16——线程生命周期
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞(Blocking)和 ...
- Android(java)学习笔记171:Service生命周期
1.Service的生命周期 Android中的Service(服务)与Activity不同,它是不能和用户交互,不能自己启动的,运行在后台的程序,如果我们退出应用的时候,Servic ...
随机推荐
- EntityFramework CodeFirst 数据库迁移
参考: https://msdn.microsoft.com/en-us/data/jj591621 https://msdn.microsoft.com/en-us/library/dd394698 ...
- oracle 基础知识(五)--回滚(commit和rollback)
一,commit 01,commit干了啥 commit 就是提交的意思.也就是当你把99%的东西都做好了,然后你执行最后一步的操作...再commit前的话你可能啪啪啪啪啪,敲了几百条sql DML ...
- 4GLTE@NB-IOT
参考:https://www.cnblogs.com/pangguoming/p/9755916.html NB-IOT特点:在4G基础上发展而来,覆盖广,海量接入,成本低低功耗:不适合应用情况:大数 ...
- easyUI--datagrid 实现按键控制( enter tab 方向键 )
1.表格定义时加上 onClickCell: onClickCell,2.定义列时加入编辑器3.引入 key.js 即可使用 enter 键 或者向下箭头 选中单元格下移 选中单元格上移 tab键 选 ...
- pat09-散列3. Hashing - Hard Version (30)
09-散列3. Hashing - Hard Version (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HE, Qin ...
- Aaja.pro 未定义
问题描述:安装新系统后,将代码迁至新系统,所有用到ajaxpro框架调用ajax方法时均报“xx未定义”的错: 解决问题的过程 : 1.看看你在前台调用的方法的命名空间,方法名和后台的是否对应.在后台 ...
- tomcat一个IP绑定多个域名,不同域名访问不同的应用
修改conf文件夹下面的server.xml的Engine里面的内容即可原始内容如下: …… <Engine name="Catalina" defaultHost=&quo ...
- Google android开发者 中国官方文档开放了呀
Google官方开发文档地址 包括 android , android TV
- IDEA中一个工程多个模块(module)分别提交到不同的git服务器
说明:本文档适用于一个工程多个模块的项目,每个模块对应不同的git服务器地址. 一.将本地项目导入到git服务器 1.打开 File -> Settings,选择 Version C ...
- Scanners-Box:开源扫描器大全 2017-04-22
Scanners-Box:开源扫描器大全 2017-04-22 Scanners-Box是一个集合github平台上的安全行业从业人员自研开源扫描器的仓库,包括子域名枚举.数据库漏洞扫描.弱口令或信息 ...