前言

本次主要分享一下Java线程的六种状态及其转换。

如果对于线程的创建方式不太了解,推荐观看并发编程——认识java里的线程

线程的状态及其转换

操作系统线程的五种状态

  1. 新建(NEW)
  2. 就绪(RUNNABLE)
  3. 运行(RUNNING)
  4. 阻塞(BLOCKED)
  5. 死亡(DEAD)

    注意:BLOCKED状态,包括三种类型状态:等待(wait)、睡眠(sleep)、阻塞(申请资源:I\O、对象的锁);

Java线程的六种状态

  1. 新建(NEW)
  2. 可运行(RUNNABLE)
  3. 阻塞(BLOCKED)
  4. 等待(WAITING)
  5. 超时等待(TIMED_WAITING)
  6. 终止(TERMINATED)

    注意:Java线程中的可运行状态(RUNNABLE)相当于操作系统线程状态中的就绪状态(RUNNABLE)和运行状态(RUNNING)

依据来源于Thread中的源码中有线程状态的一个枚举类,目前只有六种。

Java线程的状态图

新建(NEW)

当用new操作符创建一个新线程的时候,如new Thread(r),这个线程还没有开始运行。这意味着它的状态就是新建(NEW)。当一个线程处于新建状态时,程序还没有开始运行线程中的代码。

可运行(RUNNABLE)

一旦调用start方法,线程就处于可运行(RUNNABLE)状态。一个可运行的线程可能正处于运行,也可能没有运行。要由操作系统为线程提供具体的运行时间。(不过Java规范没有将正在运行作为一个单独状态。一个正在运行的线程仍然处于可运行状态。)

理解可运行状态

一旦一个线程开始运行,它不一定始终保持运行。事实上,运行中的线程有时需要暂停,让其他线程有机会运行。线程调度的细节依赖于操作系统提供的服务。抢占式调度系统给每一个可运行线程一个时间片来执行任务。当时间片用完时,操作系统剥夺该线程的运行权,并给另外一个线程一个机会来运行。当选择下一个线程时,操作系统会考虑线程的优先级。

现在所有的桌面以及服务器操作系统都使用抢占式调度。但是,像手机这样的小型设备可能使用协作式调度。在这样的设备中,一个线程只有在调度yield方法或者被阻塞或等待时才会失去控制权。

在有多个处理器的机器上,每一处理器运行一个线程,可以有多个线程并行运行。当然,如果线程的数目多于处理器数目,调度器还是需要分配时间片。

记住,在任何给定时刻,一个可运行的线程可能正在运行也可能没有运行(正是因为这样,这个状态称为“可运行”,而不是“运行”)。

阻塞(BLOCKED)

一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态,说白了就是一个线程获取一个内部的对象锁的时候这个锁对象被其他线程占用了,那么这个线程就会被阻塞。是一种锁阻塞。

等待(WAITING)

一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态,例如我们调用Object.wait或者Thread.join这些就会出现这种情况。

超时等待(TIMED_WAITING)

处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。一般像我们使用sleep(1000)方法,让线程睡一秒,过一秒之后线程就会自动唤醒继续执行。

带有超时参数的方法还有很多,计时版的Object.wait,Thread.join、Lock.tryLock以及Condition.await,调用这些方法会让线程进入超时等待状态。

这些后续我会继续做分享,敬请期待。

终止(TERMINATED)

1、终止状态为了两种情况,一种就是我们调用run方法,正常执行完毕,线程自然终止。

2、因为一个没有捕获的异常终止了run方法,使线程意外终止。

具体来说,可以调用线程的stop方法杀死线程。该方法抛出一个ThreadDeath错误对象,这会杀死线程。不过,stop方法已经被废除了,不要在你的代码中调用这个方法。

既然有讲到stop方法,那么下一篇就来分享一下线程所提供的一些方法,敬请期待。

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞关注。

并发编程——Java线程的6种状态及切换的更多相关文章

  1. 透彻讲解,Java线程的6种状态及切换

    Java中线程的状态分为6种. 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法.2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running) ...

  2. Java线程的5种状态及切换(透彻讲解)-京东面试

    一.Thread的几个重要方法: 我们先了解一下Thread的几个重要方法. a.start()方法,开始执行该线程:b.stop()方法,强制结束该线程执行:c.join方法,等待该线程结束.d.s ...

  3. Java线程的5种状态及切换

    ava中的线程的生命周期大体可分为5种状态. 1. 新建(NEW):新创建了一个线程对象. 2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方 ...

  4. Java线程的6种状态及切换

    Java中线程的状态分为6种. 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法.2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running) ...

  5. Java线程的5种状态及切换(透彻讲解)

    http://blog.csdn.net/pange1991/article/details/53860651

  6. java 线程的几种状态(转载)

      java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在 ...

  7. JAVA 线程的6种状态

    JAVA线程的6种状态 线程状态(Thread.State).线程处于下列状态的其中之一. 一个线程在一个时刻只能有一个状态.这些状态是虚拟机线程状态,不能反应任何操作系统的线程状态. 通过Threa ...

  8. java 线程的几种状态

    java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...

  9. 【转】java 线程的几种状态

    java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...

随机推荐

  1. kubernetes源码解析---- apiserver路由构建解析(2)

    kubernetes源码解析---- apiserver路由构建解析(2) 上文主要对go-restful这个包进行了简单的介绍,下面我们通过阅读代码来理解apiserver路由的详细构建过程. (k ...

  2. Python-统计目录(文件夹)中Excel文件个数和数据量

    背景:前一阵子在帮客户做Excel文件中的数据处理,但是每周提交周报,领导都需要统计从客户接收的文件数量以及记录数.所以我就简单写了统计的脚本,方便统计目录(文件夹)中的Excel文件个数和数据量. ...

  3. POJ 1220 大数字的进制转换,偷下懒,用java

    题意为进制转换,Java的大数类就像是作弊 import java.math.BigInteger; import java.util.Scanner; public class Main { pub ...

  4. SonarQube集成Gitlab

    SonarQube配置gitlab Gitlab创建访问Token 拷贝此Token至Sonarqube进行配置 检查配置配置成功 可以看到权限内的项目

  5. 线程中的join()

    http://blog.itpub.net/31555134/viewspace-2221319/ 一直对join()方法不是很理解,在A线程中, B线程调用了join()方法,然后在内部实际是wai ...

  6. java基础---类和对象(1)

    一. 类和对象 面向对象:以属性和行为的观点去分析现实生活中的事物,将功能封装进对象, 强调具备了功能的对象,以类/对象为最小单位,考虑谁来做 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做 ...

  7. Nginx PHP测试装

    Nginx yum -y install gcc gcc-c++ make automake autoconf pcre pcre-devel zlib zlib-devel openssl open ...

  8. 获取操作系统OS等相关信息

    问题一:Windows SDK 8.1版本中的VersionHelper.h文件当中没有IsWindows10ORGreater,所以当你用IsWindows8Point1ORGreater判断出版本 ...

  9. Chirp Z-Transform

    Chirp Z-Transform 其实不是什么特别难的东西. 用于解决等比数列/类等比数列多点求值. \(b_i=\sum_{j=0}^{n}a_jc^{ij}\) 注意到 \(ij=\binom{ ...

  10. Spring MVC中的M V C

    M→Model 模型 V→View 视图 C→Controller 控制器 也就是说一次交互由生到死(请求到相应) 需要经过 这三个层级 来完成 那么为什么这么设计 这么设计又有什么好处 我是这么认为 ...