Android(java)学习笔记65:线程的生命周期
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)学习笔记65:线程的生命周期的更多相关文章
- 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 ...
随机推荐
- oracle学习 十一 包+复合类型+自定义异常(持续更新)
在这里讲一下包的概念, 二话不说上个例子 包头: create or replace package pck_test is procedure proc_report_salary(name nva ...
- LDS,LES,LFS,LGS,LSS指令
LDS,LES,LFS,LGS,LSS其指令格式都是 LDS reg16,mem32 其意义是同时给一个段寄存器和一个16位通用寄存器同时赋值 具体如下:reg16=mem32的低字, ...
- .NET文件上传的大小限制配置
<system.web> <!--maxRequestLength单位是Kb--> <httpRuntime maxRequestLength="20971 ...
- hdoj 5344 MZL's xor
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5344 #include<stdio.h> #include<cstring> ...
- d3d导致cairo不正常
最近要把cairo集成到项目中,却发现cairo不能工作了 折腾了两天才找到了原因:cairo的一个trick导致浮点数计算错误: http://blog.163.com/lvan100@yeah/b ...
- 一个简单的Java程序例子以及其几种注释
在说道主题前,先来啰嗦两句,o()︿︶)o 唉,不说两句心里就有个疙瘩,也许这就是所谓的强迫症吧,好了说说我想啰嗦的,其实也就是这样子的,关于Java开发工具箱的下载以及环境的配置.Java开发工具箱 ...
- Oracle用户、权限、角色管理
Oracle 权限设置一.权限分类:系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言). 实体权限:某种权限用户对其它用户的表或视图的存取权限.(是针对表或视图而言的). 二.系统权 ...
- css初始化代码方案
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-06-24) 为了消除各浏览器对css默认的设置,保持网页在各浏览器中的外观保持一致,初始化css就显得非常必要了!很多时候 ...
- Javascript(JS)对Cookie的读取、删除、写入操作帮助方法
var CookieUtils = { get: function (name) { var cookieName = encodeURIComponent(name) + '=', cookieSt ...
- eclipse下安装Extjs的插件spket
最近项目要用ext进行开发,所以这段时间开始学习ext. 我这里用的是ext3.0,eclipse3.5. 每次都要去查API,很烦,所以装个EXT提示的插件对初学者来说有很大的帮助. 假设你已经下载 ...