`

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 线程状态转换图 Java 线程状态转换图是 Java 编程中非常重要的一个概念,它描述了线程在不同的状态之间的转换关系。了解线程状态转换图对 Java 编程的理解和应用非常重要。本文将详细介绍 Java 线程状态转换图...

    Java线程状态流转图

    Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...

    Java线程:线程状态的转换

    ### Java线程:线程状态的转换 #### 一、线程状态及其转换 ...通过以上分析,我们可以看到Java线程状态转换的基本原理以及如何利用线程状态来控制线程的行为,这对于开发高性能、高可靠性的并发程序至关重要。

    java基础--11.多线程-1

    Java线程有五种基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。了解这些状态有助于理解和调试多线程程序。 五、线程调度 1. 非抢占式调度:线程按照它们被创建...

    Java源码查看线程的运行状态.rar

    线程在Java中由`java.lang.Thread`类表示,其生命周期包括以下几种状态: 1. **新建**(New):当使用`new Thread()`创建了一个线程对象时,线程处于新建状态。 2. **可运行**(Runnable):调用`start()`方法后,...

    java解惑--疑难问题解疑

    3. **多线程**:Java提供了丰富的多线程支持,包括Thread类和Runnable接口。理解线程的生命周期、同步机制(如synchronized关键字、volatile变量、Lock接口)以及死锁、活锁和饥饿状态,是编写高效并发程序的基础。 ...

    Java学习教程-探究JAVA线程状态及转化视频

    在Java中,线程的状态及其转换是非常关键的概念,理解和掌握这些可以帮助我们编写出更加高效、稳定的多线程程序。本教程将深入探讨Java线程的五种基本状态以及它们之间的转换。 1. **新建(New)**:当使用`Thread`...

    想学java,新手学java,怎样才能学好java,java视频教程,零基础学习java--java学习指导文档.doc

    - **线程创建方式**:继承 Thread 类、实现 Runnable 接口。 - **同步机制**:synchronized 关键字、ReentrantLock 等。 - **并发工具类**:如 ExecutorService、Semaphore 等。 - **线程安全问题**:避免共享可变...

    大学课程讲义-Java基础-多线程.pptx

    可执行状态是指其他线程调用了处于新建状态线程的start方法,该线程对象将转换到“可执行状态”。运行状态是指处在“可执行状态”的线程对象一旦获得了 CPU 控制权,就会转换到“执行状态”。阻塞状态是指线程在...

    java thread的教程

    - **线程生命期**:了解线程的状态转换和生命周期管理。 - **共享数据访问**:掌握解决数据竞争的方法。 - **同步机制**:熟悉各种同步工具和技术。 - **高级API**:了解额外的线程API细节。 **进一步学习资源:** ...

    Java 基础-尚硅谷学习笔记(含面试题) 2023年

    - **线程状态**:理解新建、就绪、运行、阻塞和死亡等线程状态。 8. **反射** - 反射机制允许在运行时动态地获取类的信息并操作类的对象,常用于插件系统、序列化和框架开发。 9. **泛型** - 泛型提高了代码的...

    thread源码java-java-multi-thread-programming:java多线程编程核心技术

    Java的线程状态转换是理解多线程行为的关键。线程有五种基本状态:新建、就绪、运行、阻塞和终止。线程通过start()方法从新建变为就绪状态,然后由JVM调度进入运行状态。当线程执行阻塞操作(如等待锁、IO操作)时,...

    Java 实例 - 线程挂起源代码+详细指导教程.zip

    理解线程的生命周期、状态转换(新建、就绪、运行、阻塞、死亡)以及线程池的概念也是至关重要的。 总之,理解和掌握Java线程挂起是提升多线程编程技能的关键。通过实践和不断学习,你将成为一个熟练的Java并发...

    Java 项目-基于Java的模拟写字板的设计与实现.zip

    Java的File类和FileInputStream/FileOutputStream用于读写文件,而对象序列化(Serializable接口)可能是用来保存和加载写字板状态的。 6. **数据库存储**: 标签中提到了“数据库”,意味着可能使用了Java的JDBC...

    java陷阱--面试(题集)杂谈

    键字)用于声明变量、方法或类,表示不可变或最终状态。在类定义中,`final`修饰的类不能被继承;对于方法,`final`意味着该方法不能被重写;对于变量,`final`则表示一旦赋值后就不能再改变。 finally是异常处理的...

    Java面经-百度banbne-副本.pdf

    Java中创建线程可以通过继承Thread类或实现Runnable接口,推荐使用后者。 2. **线程状态**: Java线程有多种状态,包括新建、就绪、运行、阻塞和死亡等状态。 3. **守护线程**: 守护线程是为其他线程服务的...

    java-core-test

    - 线程状态:理解新生、就绪、运行、阻塞和死亡五种线程状态。 - 线程同步:synchronized关键字,wait(), notify(), notifyAll()方法,以及Lock接口的使用。 - 守护线程与线程池:理解守护线程的概念,以及...

    Java线程状态转换.pdf

    Java线程状态转换是Java多线程编程中的关键概念,对于理解和优化并发程序至关重要。Java线程在其生命周期中经历多种状态,这些状态之间的转换是由线程调度器根据特定的策略来决定的。以下是对Java线程状态转换的详细...

    java面试-JVM+多线程三个版本面试题,全集.zip

    4. **线程状态**:线程有哪些状态,如何在这些状态之间转换? 5. **线程池**:ExecutorService、ThreadPoolExecutor和ScheduledThreadPoolExecutor的作用,以及如何配置和使用线程池。 6. **并发容器**:...

    Java高特-嗖嗖移动业务大厅.zip

    1. **多线程**:Java提供了强大的并发处理能力,通过Thread类和Runnable接口实现。项目可能涉及到线程的创建、同步、协作以及线程池的使用,如ExecutorService和ThreadPoolExecutor。在嗖嗖移动业务大厅中,可能需要...

Global site tag (gtag.js) - Google Analytics