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:线程的生命周期的更多相关文章

  1. Java学习笔记之——线程的生命周期、线程同步

    一. 线程的生命周期 新建(new Thrad):创建线程后,可以设置各个属性值,即启动前 设置 就绪(Runnable):已经启动,等待CPU调动 运行(Running):正在被CPU调度 阻塞(B ...

  2. 吴裕雄--天生自然java开发常用类库学习笔记:线程的生命周期

    class MyThread implements Runnable{ private boolean flag = true ; // 定义标志位 public void run(){ int i ...

  3. mars android视频学习笔记一:Activity生命周期

    (1)创建:onCreate->onStart->onResume;(2)失去焦点:onPause->onStop:(3)重新获得焦点:onRestart->onStart-& ...

  4. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  5. java学习笔记之线程(Thread)

    刚开始接触java多线程的时候,我觉得,应该像其他章节的内容一样,了解了生命周期.构造方法.方法.属性.使用的条件,就可以结束了,然而随着我的深入学习了解,我发现java的多线程是java的一个特别重 ...

  6. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  7. Java并发编程:线程的生命周期是个怎样的过程?

    前言 在日常开发过程中,如果我们需要执行一些比较耗时的程序的话,一般来说都是开启一个新线程,把耗时的代码放在线程里,然后开启线程执行.但线程是会耗费系统资源的,如果有多个线程同时运行,互相之间抢占系统 ...

  8. Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗

    在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...

  9. JAVA学习笔记16——线程生命周期

    当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞(Blocking)和 ...

  10. Android(java)学习笔记171:Service生命周期

    1.Service的生命周期         Android中的Service(服务)与Activity不同,它是不能和用户交互,不能自己启动的,运行在后台的程序,如果我们退出应用的时候,Servic ...

随机推荐

  1. [原创]Devexpress XtraReports 系列 5 创建交叉报表

    昨天我们已经介绍了如何创建多栏报表,详见:[原创]Devexpress XtraReports 系列 4 创建多栏报表 今天我们继续我们的XtraReports系列.Demo和数据库文件最后会附上. ...

  2. JavaScript 核心参考教程 内置对象

    这个标准基于 JavaScript (Netscape) 和 JScript (Microsoft).Netscape (Navigator 2.0) 的 Brendan Eich 发明了这门语言,从 ...

  3. python用httplib模块发送get和post请求

    在python中,模拟http客户端发送get和post请求,主要用httplib模块的功能. 1.python发送GET请求 我在本地建立一个测试环境,test.php的内容就是输出一句话: 1 e ...

  4. .Net实现的批量删除(使用了repeater控件)

    前台 <asp:Repeater ID="Repeater1" runat="server"> <HeaderTemplate> < ...

  5. commondline 之二 执行类

    E:\cn\zno\commandline\Test.class package cn.zno.commandline; import java.lang.management.ManagementF ...

  6. 使用多个Worker的时候Odoo的系统日志配置

    当我们开启Wokrer来启动Odoo的时候,用默认的日志会出现日志丢失的问题,这个是logger的问题:多个进程对单个文件写入日志.有一个简单的解决办法:配置openerp-server.conf,开 ...

  7. 用ILMerge.exe合并dll

    F:\ILMerge>ILMerge /targetplatform:v4,"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319" / ...

  8. 转载:mysql update更新带子查询的实现方式

    出自:http://576017120.iteye.com/blog/1947154 mysql中更新时不能直接将更新的表作为查询的表,可以通过临时中间表的形式. 总结一下: 一:单表更新时 例如: ...

  9. STM32的TAMPER-RTC管脚作为Tamper使用 - 防拆机

    当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件.侵入检测事件将所有数据备份寄存器内容清除.  然而为了避免丢失侵入 ...

  10. Codeforces Round #189 (Div. 1) B. Psychos in a Line 单调队列

    B. Psychos in a Line Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/p ...