`
panxq0809
  • 浏览: 296823 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

线程的4个状态之间是如何进行转换的

    博客分类:
  • 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方法实现的。

分享到:
评论

相关推荐

    Java线程:线程状态的转换

    线程状态之间的转换是多线程编程的核心概念之一,理解这些转换有助于我们更好地设计和调试并发程序。 1. **新状态到可运行状态**:当线程对象的`start()`方法被调用时,线程从新状态进入可运行状态。 2. **可运行...

    java线程状态转换图

    Java 线程状态转换图是 Java 编程中非常重要的一个概念,它描述了线程在不同的状态之间的转换关系。了解线程状态转换图对 Java 编程的理解和应用非常重要。本文将详细介绍 Java 线程状态转换图,包括初始状态、可...

    Java线程状态转换.pdf

    Java线程在其生命周期中经历多种状态,这些状态之间的转换是由线程调度器根据特定的策略来决定的。以下是对Java线程状态转换的详细说明: 1. **新建状态 (New)**: 当一个线程被创建,例如通过`Thread`类的构造函数...

    Java线程:线程状态的转换.pdf

    在Java编程中,线程是并发执行任务的基本单位,理解线程状态的转换对于编写高效的多线程程序至关重要。Java线程的状态主要包括以下五种: 1. 新状态(New):当通过`new Thread()`创建了一个线程对象,但还未调用`...

    在java中的线程的转换图

    线程状态之间的转换可以通过以下方式触发: - `start()`方法将线程从新建状态转移到可运行状态。 - CPU调度将线程从可运行状态转移到运行状态。 - 系统资源竞争、`synchronized`关键字、`wait()`, `sleep()`或`join...

    Java多线程机制和线程之间的协作

    每个线程有自己的生命周期,包括新建、就绪、运行和死亡四个状态。 在Java中创建线程主要有两种方式:继承Thread类和实现Runnable接口。当创建Thread的子类时,你需要重写run()方法,这个方法定义了线程执行的具体...

    线程状态图

    线程状态的变化是通过调用特定的方法实现的,如`sleep()`使线程暂停指定的时间,`join()`等待一个线程结束,`interrupt()`中断一个正在阻塞的线程,等等。Java的实时系统根据线程的优先级和状态决定哪个线程获得CPU...

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    在探究JVM线程状态以及Thread.sleep的实现原理时,我们首先需要了解Java线程与操作系统...理解线程状态以及这些状态之间的转换机制,有助于开发者在设计多线程程序时作出更为合理的决策,以提高程序的性能和可靠性。

    Java线程状态转换关系实例解析

    Java线程状态转换关系实例解析是Java多线程编程中的一种重要概念,它指的是Java线程在不同的状态之间的转换关系。了解这些状态转换关系可以帮助开发者更好地编写多线程程序,避免线程相关的问题。 状态1:新建状态 ...

    线程及多线程的详细讲解

    状态之间的转换如下: - 当线程对象被创建后,它处于新建状态。 - 调用`start()`方法后,线程进入就绪状态。 - 在获得CPU时间片后,线程进入运行状态。 - 运行过程中,线程可能会因等待某些条件而进入阻塞状态。 - ...

    线程的5种状态详解.doc

    线程状态之间的转换非常灵活,可以从一种状态转换到另一种状态,例如: - 新建 → 可运行 - 可运行 → 运行 - 运行 → 阻塞 - 阻塞 → 可运行 - 可运行 → 死亡 #### 实现 Runnable 接口与继承 Thread 类 Java ...

    到底一个线程占用多少内存

    TCB包含了线程状态、调度信息、寄存器上下文等关键数据,它的大小通常取决于具体的操作系统实现。例如,在Linux系统中,一个线程的内核内存栈空间一般为两个页的大小,即8KB。这是因为内核栈用于存储线程在执行内核...

    浅析C# 状态机Stateless

    状态机(Finite State Machine)是一种数学模型,可以用来描述系统的状态和状态之间的转换。状态机由三个部分组成:状态、事件和转换。状态是系统的当前状态,事件是触发状态转换的原因,转换是从一个状态到另一个...

    操作系统对进程状态的转换

    线程的状态转换(如新建、就绪、运行、等待、阻塞和结束)与操作系统进程状态转换有相似之处,但线程的管理更为灵活,因为线程之间的切换成本比进程低。 总结,操作系统对进程状态的转换是保证系统效率和并发性的...

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

    Java线程是并发编程的核心部分,...总的来说,Java线程状态和转换是Java并发编程的基础,对于提升软件的并发性和响应性具有重要意义。通过本教程的视频学习,你将能更深入地理解这些概念,并能够在实际开发中灵活运用。

    Java多线程-线程的生命周期

    线程状态之间的转换是由Java API的方法调用触发的,如`start()`、`sleep()`、`wait()`、`join()`等。了解这些状态和转换机制对于编写高效的并发程序至关重要,因为它有助于避免死锁、饥饿和其他并发问题。在实际编程...

    Java线程的生命周期和状态控制[定义].pdf

    线程可以在运行状态与就绪状态之间切换,例如,当线程调用`yield()`方法时,它会让出CPU并回到就绪状态。此外,线程也可能因`sleep()`、阻塞IO操作、同步监视器锁等待、等待通知等原因进入阻塞状态。 4. 阻塞状态:...

    多线程面试题

    3. **线程状态**:Java中的线程有五种状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。理解这些状态以及它们之间的转换是分析多线程问题的关键。 4. **同步机制**:...

    史上最强多线程面试44题和答案:线程锁+线程池+线程同步等

    每种状态之间的转换都有特定的原因和触发条件,如从运行状态变为阻塞状态可能是因为等待输入输出操作完成,或者因为尝试获取一个已经被其他线程锁定的对象锁而被阻塞。理解这些状态及其转换对于有效管理和控制线程至...

    Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能

    4. 如果请求间隔固定,可以使用`time.sleep`在请求之间插入延迟,但更高级的方法是使用`asyncio.sleep`或者`eventlet`库来实现非阻塞的延迟。 5. 监控线程运行情况,确保没有异常或死锁发生,可以通过日志记录或者...

Global site tag (gtag.js) - Google Analytics