`

Java Thread--状态转换

    博客分类:
  • Java
阅读更多

      一个线程创建之后,总是处于其生命周期的4个状态之一中。线程的状态表明此线 程当前正在进行的活动,而线程的状态是可以通过程序来进行控制的,就是说,可以对线程 进行操作来改变状态。这些操作包括启动(start)、终止(stop)、睡眠(sleep)、挂起 (suspend)、恢复(resume)、等待(wait)和通知(notify)。每一个操作都对应了一个方法,这些 方法是由软件包java.lang提供的。
     ①创建(new)状态
     如果创建了一个线程而没有启动它,那么,此线程就处于创建状态。比如,下述语句执行 以后,使系统有了一个处于创建状态的线程myThread:
         Thread myThread= new MyThreadClass();
其中,MyThreadClass()是Thread的子类,而Thread是由Java系统的java.lang软件包提 供的。
     处于创建状态的线程还没有获得应有的资源,所以,这是一个空的线程。线程只有通过 启动后,系统才会为它分配资源。对处于创建状态的线程可以进行两种操作:一是启动 (start)操作,使其进入可运行状态,二是终止(stop)操作,使其进入消亡状态。如果进入到消 亡状态,那么,此后这个线程就不能进入其他状态,也就是说,它不再存在了。
     start方法是对应启动操作的方法,其具体功能是为线程分配必要的系统资源;将线程 设置为可运行状态,从而可以使系统调度这个线程。
     ②可运行(runnable)状态
     如果对一个处于创建状态的线程进行启动操作,则此线程便进入可运行状态。仍以前面 创建的myThread线程为例,用下列语句: myThread.start(); 则线程myThread进入可运行状态。上述语句实质上是调用了线程体即run()方法。注意, run()方法包含在myThread线程中,也就是先由java.lang包的Thread类将run()方法 传递给子类MyThreadClass(),再通过创建线程由于类MyThreadClass()传递给线程 myThread。
     线程处于可运行状态只说明它具备了运行条件,但可运行状态并不一定是运行状态。因 为在单处理器系统中运行多线程程序,实际上在一个时间点只有一个线程在运行,而系统中 往往有多个线程同时处于可运行状态。系统通过快速切换和调度使所有可运行线程共享处 理器,造成宏观上的多线程并发运行。
     可见,一个线程是否处于运行状态,除了必须处于可运行状态外,还取决于系统的调度。
     在可运行状态可以进行多种操作,最通常的是从run()方法正常退出而使线程结束,进 入消亡状态。此外,还可以有如下操作:
     挂起操作,通过调用suspend方法来实现;
     睡眠操作,通过调用sleep方法来实现;
     等待操作,通过调用wait方法来实现;
     退让操作,通过调用yield方法来实现;
     终止操作,通过调用stop方法来实现。
     前面三种操作都会使一个处于可运行状态的线程进入不可运行状态。比如,仍以 myThread线程为例,当其处于可运行状态后,再用如下语句:
         myThreadsleep(5000);
则调用sleep方法使myThread线程睡眠5秒(5000毫秒)。这5秒内,此线程不能被系统调 度运行,只有过5秒后,myThread线程才会醒来并自动回到可运行状态。
     如果一个线程被执行挂起操作而转到不可运行状态,则必须通过调用恢复(resume)操 作,才能使这个线程再回到可运行状态。
     退让操作是使某个线程把CPU控制权提前转交给同级优先权的其他线程。
     对可运行状态的线程也可以通过调用stop方法使其进入消亡状态。
     ③不可运行(not runnable)状态
     不可运行状态都是由可运行状态转变来的。一个处于可运行状态的线程,如果遇到挂起 (suspend)操作、睡眠(sleep)操作或者等待(wait)操作,就会进入不可运行状态。另外,如果 一个线程是和I/O操作有关的,那么,在执行I/O指令时,由于外设速度远远低于处理器速 度而使线程受到阻塞,从而进入不可运行状态,只有外设完成输入/输出之后,该线程才会自 动回到可运行状态。线程进入不可运行状态后,还可以再回到可运行状态。通常有三种途径 使其恢复到可运行状态。
     一是自动恢复。
     通过睡眠(sleep)操作而进入不可运行状态的线程会在过了指定睡眠时间以后自动恢 复到可运行状态;由于I/O阻塞而进入不可运行状态的线程在外设完成I/O操作后,自动 恢复到可运行状态。
     二是用恢复(resume)方法使其恢复。
     如果一个线程由于挂起(suspend)操作而从可运行状态进入不可运行状态,那么,必须 用恢复(resume)操作使其再恢复到可运行状态。
     三是用通知(notify或notiyA11)方法使其恢复。
     如果一个处于可运行状态的线程由于等待(wait)操作面转入不可运行状态,那么,必须 通过调用notify方法或notifyAll方法才能使其恢复到可运行状态。采用等待操作往往是由 于线程需要等待某个条件变量,当获得此条件变量后,便可由notify或notifyAll方法使线 程恢复到可运行状态。
     恢复到可运行状态的每一种途径都是有针对性的,不能交叉。比如,对由于阻塞而进入 不可运行状态的线程采用恢复操作将是无效的。
     在不可运行状态,也可由终止(stop)操作使其进入消亡状态。
     ④消亡(dead)状态
     一个线程可以由其他任何一个状态通过终止(stop)操作而进入消亡状态。线程一旦进 入消亡状态,那它就不再存在,所以也不可能再转到其他状态。
     通常,在一个应用程序运行时,如果通过其他外部命令终止当前应用程序,那么就会调 用stop方法终止线程。但是,最正常、最常见的途径是由于线程在可运行状态正常完成自身 的任务而“寿终正寝”,从而进入消亡状态,这个完成任务的动作是由run方法实现的。

 

 转载自:http://hi.baidu.com/jsoftware/blog/item/4a909424335160044d088d0b.html   

分享到:
评论

相关推荐

    Java线程:线程状态的转换

    初学者学习java多线程的必备良师啊!...内容包含:线程的状态及状态之间的转换 线程的优先级 线程的几大常用方法! 申明: 本文出自 “熔 岩” 博客,本人从百度文库转载而来! 大家都尊重一下 作者的版权!

    21天学通Java-由浅入深

    252 13.2.1 继承Thread类定义线程 252 13.2.2 实现Runnable接口定义线程 253 13.3 运行线程 254 13.3.1 启动线程 254 13.3.2 同时运行多个线程 256 13.4 线程生命周期 257 13.4.1 新建状态 257 13.4.2 准备状态 257 ...

    Java开发技术大全(500个源代码).

    narrowingConversion_1.java 缩减转换引发错误示例1 narrowingConversion_2.java 缩减转换引发错误示例2 notMultipleOfThree.java 把100-200之间不能被3整除的数输出 outputByDoWhile.java 用while循环随机输出...

    在java中的线程的转换图

    在java中的线程转换的总描述,结合了所有的java有关线程的状态转移图

    JAVA基础课程讲义

    自动类型转换 32 基本类型转化时常见错误和问题 33 方法 33 简单的键盘输入和输出 33 本章思考作业 34 上机操作 34 第二章(2) 控制语句 35 顺序结构 35 选择结构 35 if单选择结构 35 if-else双选择结构 35 If-elseif...

    java初学者必看

    11.2.3 线程状态转换 11.2.4 等待线程结束 11.3 线程调度 11.4 线程同步 11.4.1 同步概念 11.4.2 同步格式 11.4.3 同步应用 11.5 线程通信 11.5.1 生产者/消费者 11.5.2 共享队列 11.5.3 运行生产者/消费...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己的第一个Java程序跑...

    JAVA语言程序设计【高清版】.pdf

    201 10.4.2 随机访问文件 202 习题 203 第11章 线程 204 11.1 线程和多线程 204 11.1.1 线程的概念 204 11.1.2 线程的结构 205 11.2 线程的状态 205 11.3 创建线程 206 11.3.1 继承Thread类 206 ...

    java基础案例与开发详解案例源码全

    12.2.1 线程的状态及转换310 12.2.2 线程睡眠311 12.2.3 线程让步313 12.2.4 线程的加入313 12.3 线程的调度和优先级314 12.4 线程的同步315 12.4.1 线程同步的方法317 12.4.2 对象锁319 12.4.3 wait和notify方法320...

    JAVA面试题最全集

    调用Thread类的destroy()方法有什么后果? 58.多线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 59.使用socket建立客户端与服务器的通信的过程 60.JAVA语言国际化应用,Locale类,...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己的第一个Java程序跑...

    java 面试题 总结

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...

    Java Bug模式详解

    Java.Bug模式详解 第1章 混乱环境下的灵活方法 1.1 软件设计、实现和维护的趋势 1.1.1 对于稳定、安全 系统的需求增加 1.1.2 传统软件工程技 术的局限性 1.1.3 开放源代码的软 件项目的可利用性 1.1.4 对于...

    java面试宝典

    189、Can a Java Thread be started from Servlet class, and what will be the implications? 45 190、What is HTTP Session tracking and why is it important? 45 191、What is session management, and how is ...

    Java典型模块

    第4章 学生并发接水(线程Thread) 4.1 学生并发接水原理 4.1.1 项目结构框架分析 4.1.2 项目功能业务分析 4.2 不排队形式学生并发接水 4.2.1 水龙头类 4.2.2 学生类 4.2.3 测试类 4.3 学生并发接水的其他形式 4.3.1...

    java并发编程:线程基础

    探讨线程在不同状态间的转换和原因。 线程的优先级和命名: 介绍线程的优先级概念,解释如何设置线程的优先级。讲解线程命名的重要性以及如何为线程设置有意义的名称。 线程的同步与阻塞: 引入多线程访问共享资源...

    Java多线程技术 线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口

    本文首先介绍了线程的有关概念,接着介绍了线程的生命期及其状态间的转换,多线程的调度 原则,线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口

    超级有影响力霸气的Java面试题大全文档

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...

Global site tag (gtag.js) - Google Analytics