`
天府小茶客
  • 浏览: 12804 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java线程的生命周期

阅读更多

(转自:http://www.cnblogs.com/fysola/p/6066290.html)

线程有五个状态,分别是新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。

新建和就绪

程序使用new会新建一个线程,new出的对象跟普通对象一样,JVM会为其分配内存,初始化成员变量等,此时线程并没有运行,而是就是新建状态。

当线程对象调用start后,线程将进入就绪状态。JVM会为其创建函数调度栈和计数器,但此时线程依然没有运行,而是等待获取CPU执行片

下面的例子可以证明当线程对象调用start后,并不一定立即执行,

1

2

3

4

5

6

7

for (int i=0; i<50; i++) {

    System.out.println(Thread.currentThread().getName()+" "+i);

    if(i==20){

        SecondThread st = new SecondThread();

        new Thread(st, "new thread 1").start();

    }

}

上面是在main中创建子线程,下面是运行结果,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

...

 

main 18

main 19

main 20

main 21

main 22

new thread 1 0

main 23

new thread 1 1

main 24

new thread 1 2

main 25

 

...

从上面的运行结果可以看到,原本在main中i=20的时候新建了一个子线程,并立即调用了start()使线程进入就绪状态,但是一直等到i=22的时候,子线程才开始运行,所以子线程何时会开始执行取决于CPU执行片的分配,由JVM调度器决定。

运行和阻塞状态

当就绪状态的线程获取了CPU执行片的之后,就进入运行状态,但是在执行过程中,可能会因为以下原因使线程进入阻塞状态

1、CPU执行片已经用完,JVM切换到其他线程执行

2、线程调用sleep()

3、线程调用了阻塞IO方法,该方法返回之前,线程会一直阻塞

4、线程试图获取被其他线程持有的同步监视器

5、线程在等待某个通知

6、程序调用了线程的suspend()将线程挂起。(容易死锁,不推荐)

线程从运行进入阻塞状态之后,接着只能继续阻塞或者再次进入就绪状态,下面情况会使线程由阻塞状态重新进入就绪状态,

1.线程调用的slee()经过了指定时间

2.线程调用的阻塞IO方法返回

3.线程成功获取同步监视器

4.线程收到其他线程发出的通知

5.被挂起(suspend)的线程又被程序调用了resume方法

下图演示了线程状态转换过程:



 

注意从上图可知,

线程从阻塞状态只能进入就绪状态,

通常情况下,就绪状态和运行状态的转换是不受程序控制的,而是由JVM线程调度机制控制的

yield()方法可以让运行状态的线程进入就绪状态

线程死亡

线程结束后就处于死亡状态,线程会以如下三种方式结束,

1、 run()或call()正常执行完成,线程正常结束

2、 线程抛出一个未捕获的Exception或Error

3、直接调用线程的stop()方法结束线程,容易死锁

注意,子线程一旦启动,其地位和主线程是一样的,所以一旦主线程结束了,子线程不会受影响,不会跟着结束

线程对象的isAlive()方法在就绪,运行,阻塞时返回true,在新建,死亡时返回false

对已经死亡的线程调用start()是无效的,会抛出异常。死亡的线程不可再次作为线程来执行。

对于新建的线程,调用两次start()方法也会抛出异常

 

 

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

相关推荐

    图解Java线程的生命周期

    正确管理线程生命周期是防止死锁、资源浪费和提高程序效率的关键。合理设计线程间的协作,使用线程池来控制线程数量,以及正确处理异常,都是编写多线程程序时应考虑的重要因素。理解并掌握Java线程的生命周期转换有...

    java线程生命周期详细讲解

    Java多线程生命周期的讲解,很详细,希望能帮到大家

    Java线程生命周期.zip

    Java线程生命周期是Java编程中的核心概念,它关乎程序的并发执行和性能优化。线程在Java中扮演着至关重要的角色,特别是在多任务处理和实时系统中。理解线程的生命周期有助于开发者更有效地管理和控制程序运行流程。...

    Java 线程的生命周期完整实例分析

    Java 中的线程生命周期主要包括以下几个阶段:新建(New)、可运行(Runnable)、运行(Running)、等待(Waiting)、阻塞(Blocked)、死亡(Dead)。在 Java 中,我们可以通过使用 Thread 的生命周期来实现多线程...

    Java线程的生命周期命名与获取代码实现

    本文将详细探讨Java线程的生命周期、调度与控制,并提供相关的代码实现。 **一、线程的生命周期** Java线程的生命周期包括五个基本状态: 1. **新建状态**(New):当使用`new Thread()`创建一个新的线程对象时,...

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

    线程生命周期的终点是死亡状态。线程在以下三种情况下结束:`run()`方法执行完毕、执行过程中抛出未捕获异常或错误,或者调用已过时的`stop()`方法。 6. 等待(Waiting): 从JDK1.5开始,线程可以进入等待状态,这...

    java线程之线程的生命周期的使用

    Java线程的生命周期主要包括以下几个阶段:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)。这些状态之间的转换是由线程...

    java 线程的生命周期详解

    在实际编程中,我们还可以使用线程池来管理线程,比如`ExecutorService`,它可以帮助我们更好地控制线程的创建和销毁,减少线程生命周期的开销。此外,线程间的同步和通信机制,如`synchronized`关键字、`wait()`, `...

    Java线程的生命周期和状态控制_动力节点Java学院整理

    "Java线程的生命周期和状态控制" Java线程的生命周期是指从线程创建到线程结束的整个过程,而状态控制是指线程在不同的状态之间的转换。Java线程的生命周期主要包括五个状态:新建状态、就绪状态、运行状态、阻塞...

    Java 线程的生命周期详细介绍及实例代码

    Java线程的生命周期是每个Java多线程开发者必须了解的重要概念。线程在它的整个生命周期中会经历五个基本状态:新建(New)、就绪(Runnable)、...理解和掌握线程生命周期对于编写高效、稳定的多线程程序至关重要。

Global site tag (gtag.js) - Google Analytics