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

新建和就绪

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

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

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

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中创建子线程,下面是运行结果,

...

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执行片的之后,就进入运行状态,但是在执行过程中,可能会因为以下原因使线程进入阻塞状态,

  • CPU执行片已经用完,JVM切换到其他线程执行
  • 线程调用sleep()
  • 线程调用了阻塞IO方法,该方法返回之前,线程会一直阻塞
  • 线程试图获取被其他线程持有的同步监视器
  • 线程在等待某个通知
  • 程序调用了线程的suspend()将线程挂起。(容易死锁,不推荐)

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

  • 线程调用的slee()经过了指定时间
  • 线程调用的阻塞IO方法返回
  • 线程成功获取同步监视器
  • 线程收到其他线程发出的通知
  • 被挂起(suspend)的线程又被程序调用了resume方法

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

注意从上图可知,

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

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

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

线程死亡

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

  • run()或call()正常执行完成,线程正常结束
  • 线程抛出一个未捕获的Exception或Error
  • 直接调用线程的stop()方法结束线程,容易死锁

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

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

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

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

JAVA基础知识之多线程——线程的生命周期(状态)的更多相关文章

  1. JAVA基础知识之多线程——线程同步

    线程安全问题 多个线程同时访问同一资源的时候有可能会出现信息不一致的情况,这是线程安全问题,下面是一个例子, Account.class , 定义一个Account模型 package threads ...

  2. JAVA基础知识之多线程——线程组和未处理异常

    线程组 Java中的ThreadGroup类表示线程组,在创建新线程时,可以通过构造函数Thread(group...)来指定线程组. 线程组具有以下特征 如果没有显式指定线程组,则新线程属于默认线程 ...

  3. JAVA基础知识之多线程——线程池

    线程池概念 操作系统或者JVM创建一个线程以及销毁一个线程都需要消耗CPU资源,如果创建或者销毁线程的消耗源远远小于执行一个线程的消耗,则可以忽略不计,但是基本相等或者大于执行线程的消耗,而且需要创建 ...

  4. JAVA基础知识之多线程——线程通信

    传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...

  5. java基础知识总结--多线程

    1.扩展Java.lang.Thread类 1.1.进程和线程的区别: 进程:每个进程都有自己独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1~n个线程. 线程:同一类线 ...

  6. Java多线程——线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

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

    线程可以分为4个状态:New(新生),Runnable(可运行):为了方便分析,还可将其分为:Runnable与Running.blocked(被阻塞),Dead(死亡). 与人有生老病死一样,线程也 ...

  8. Java精选笔记_多线程(创建、生命周期及状态转换、调度、同步、通信)

    线程概述 在应用程序中,不同的程序块是可以同时运行的,这种多个程序块同时运行的现象被称作并发执行. 多线程可以使程序在同一时间内完成很多操作. 多线程就是指一个应用程序中有多条并发执行的线索,每条线索 ...

  9. Java基础知识(多线程和线程池)

    新建状态: 一个新产生的线程从新状态开始了它的生命周期.它保持这个状态直到程序 start 这个线程. 运行状态:当一个新状态的线程被 start 以后,线程就变成可运行状态,一个线程在此状态下被认为 ...

随机推荐

  1. 学习jsp(2)

    @Webservlet 具体见:http://www.cnblogs.com/luxh/archive/2012/06/06/2537458.html. 我折腾半天才发现,在web.xml里注册了,删 ...

  2. PostgreSQL Replication之第十章 配置Slony(5)

    10.5 给复制添加表和管理的问题 一旦我们增加了此表到系统中,我们可以将它添加到复制设置.这样做有点复杂.首先,我们必须创建我们自己的新表集合并把这个和我们已经有的表合并.因此,过一段时间,我们将有 ...

  3. java-JDBC-Oracle数据库连接

    java-JDBC连接oracle数据库,StateMent和PreparedStatement对比(查询query) 1. PreparedStatement接口继承Statement, Prepa ...

  4. java类的定义以及参数传递

    class类(类似结构体)的定义 import java.util.Scanner; import java.io.*; class student{//类的名称 public String name ...

  5. 【Origin】 画道

    -夏之时,晚归途中,观云,感雨,识迷障,题以记之. 原道是东边日出西边雨, 却原来乌云蔽日雨不息; 只不过光芒也破云边洒, 可还是满地泥泞水花起. --作于二零一六年七月十一日

  6. C++之路进阶——bzoj3262(陌上花开)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ ...

  7. 变形--矩阵 matrix()

    matrix() 是一个含六个值的(a,b,c,d,e,f)变换矩阵,用来指定一个2D变换,相当于直接应用一个[a b c d e f]变换矩阵.就是基于水平方向(X轴)和垂直方向(Y轴)重新定位元素 ...

  8. springday02-go4

    1.复制xml到container/annotation下2.新建Waiter类,构造函数,初始化以及销毁函数3.在Waiter方法体前面加上@Component4.xml中添加组件扫描代码5.tes ...

  9. Demo12SimpleAdapter

    /Users/alamps/AndroidStudioProjects/Demo12SimpleAdapter/Demo12SimpleAdapter/src/main/res/layout/data ...

  10. Spark朴素贝叶斯(naiveBayes)

    朴素贝叶斯(Naïve Bayes) 介绍 Byesian算法是统计学的分类方法,它是一种利用概率统计知识进行分类的算法.在许多场合,朴素贝叶斯分类算法可以与决策树和神经网络分类算法想媲美,该算法能运 ...