`

【J2SE】线程7种状态的相互转换

    博客分类:
  • J2SE
 
阅读更多
本文转自:http://www.blogjava.net/liver/archive/2009/06/04/279924.html

今天有同事问到线程的问题,自己突然就有点蒙了,只模糊的记得个大概。
当初学习线程的时候把这7个状态记得比自己名字还熟悉
还把这7个状态编成了一段凄惨而美丽的爱情故事
没想到如今却只能记得个大概
真验证了“好记性不如烂笔头”的真理
还是赶快回忆一下吧




小小的作下解释:
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()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。

总算全部回忆了一遍JDK1.5在API的使用上有了较好的改进,效率得到很大的提高,不过几个状态转换的原理还是一样。

额……不过那一段凄惨而美丽的爱情故事还没完全想起来,那天全部回忆起来了在写吧。

  • 大小: 53.3 KB
分享到:
评论

相关推荐

    J2SE课件,内容涵盖设计模式

    Java 2 Platform, Standard Edition(简称J2SE)是Java平台的核心部分,它为开发桌面应用程序、服务器应用程序和Java小程序提供了基础。这个课件显然旨在深入探讨J2SE的各个方面,帮助学习者从基础到高级掌握Java...

    Java.Threads.3rd.Edition.txt

    理解这些状态以及如何控制线程在这几个状态之间的转换对于有效管理和优化线程至关重要。 #### 6.42.4 停止线程的两种方法 停止线程并非一件简单的事情,因为不当的操作可能会导致数据不一致或资源泄漏等问题。本书...

    大工《Java程序设计》21春在线作业3参考答案.docx.docx

    类是对象的模板,包含了对象的状态(变量)和行为(方法)。 其次,Java语言具有自动垃圾回收机制,这是一项内存管理技术,用于自动识别和释放不再使用的内存空间。选项中提到的字节编译、语法检查和堆栈溢出检查都...

    学习Java的30个基本概念

    5. 对象的三大特性——行为(behavior)、状态(state)和身份(identity)相互影响,身份用于区分相似行为的对象。 6. 类之间的关系主要有三种:use-a(依赖关系)、has-a(聚合关系)和is-a(继承关系)。 7. ...

    Java程序员笔试题

    - **线程状态图:** Java中的线程有多种状态,包括新建、就绪、运行、阻塞和终止等状态。 - **线程调度策略:** 操作系统负责线程的调度,Java程序可通过设置优先级等手段间接影响线程的执行顺序。 **7. 字符集转换...

    Java基础教程.md.pdf

    ##### 14.3 Java线程状态 - 新建:`NEW` - 就绪:`RUNNABLE` - 阻塞:`BLOCKED` - 死亡:`TERMINATED` ##### 14.4 线程同步 - **线程安全问题**:多个线程同时访问共享资源导致的问题。 - **同步代码块**:使用`...

    java语言程序设计二级考试.docx

    - **回溯法**是一种常用的软件调试技术,通过逐步回退代码状态来定位问题原因。 - 其他常见的调试技术还包括单元测试、集成测试等。 ### 10. 数据库系统的基本概念 - 数据库系统(DBS)由**数据库(DB)**、**数据库...

    java常用英语

    - **Adapter**: 适配器,用于适配两种不兼容接口之间的转换。 - **Encode**: 编码,将数据转换成特定格式的过程。 - **Random**: 随机,没有规律的、偶然发生的。 - **Gregorian Calendar**: 格里历,现代公历。 - *...

    java术语 it术语

    在 Java 中,可以创建守护线程,这些线程在主线程结束后会自动终止。 #### DAO (Data Access Object) 数据访问对象(DAO)是一种设计模式,用于提供一组方法来访问数据库。DAO 层通常位于业务逻辑层和数据层之间,...

    新版Android开发教程.rar

    � Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的有限子集,尚不承诺遵守 Java 任何 Java 规范 , 可能会造 成J ava 阵营的进一步分裂。 � 现有应用完善度不太够,需要的开发工作量较大。--------------------...

Global site tag (gtag.js) - Google Analytics