前言

本次主要分享一下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. Room-数据持久化存储(入门)

    @ 目录 一.简单使用 1.Entity 2.Dao 3.DataBase 4.使用 二.参数解析 1.Entity 2.Dao 3.查询方式 总结 # 前言 官方简介: Room 持久性库在 SQL ...

  2. pipenv管理模块和包

    pipenv安装 1. 在终端输入:pip install pipenv进行安装 用pipenv创建虚拟环境:pipenv install,在哪个文件下运行这个命令,就是给哪个文件创建虚拟环境   这 ...

  3. eclipse语言怎么设置为中文

    2021-05-30 方法:1.查找语言包下载网址,并复制:2.打开eclipse,点击"help"-"Install New Software"-" ...

  4. 流程自动化RPA,Power Automate Desktop系列 - 发布文档中心

    一.背景 内网中有一个基于VuePress搭建的静态文档中心,但是每次修改后都需要重新Build一次才行,之前都是手动执行命令,现在可以基于Power Automate Desktop来创建任务了. ...

  5. 海量数据Excel报表利器——EasyExcel(一 利用反射机制导出Excel)

    EasyExcel 写入(导出) 互联网的精髓就是共享,可以共享技术.共享经验.共享情感.共享快乐~ 很多年前就有这个想法了,从事IT行业时间也不短了,应该把自己工作和业余所学习的东西记录并分享出来, ...

  6. [网络编程]mqtt概念&数据包

    目录 前言 1. MQTT 简介 2. MQTT 通信模型 2.1 MQTT 协议 2.2 MQTT 协议中的订阅&主题&会话 2.3 MQTT 协议中的方法 3. MQTT 协议数据 ...

  7. 1.3.6、通过Path匹配

    server: port: 8080 spring: application: name: gateway cloud: gateway: routes: - id: guo-system4 uri: ...

  8. shiro框架整合ssm框架

    下面我通过一个web的maven项目来讲解如何将shiro整合ssm框架,具体结构如下图 一.引入依赖的jar包 <?xml version="1.0" encoding=& ...

  9. SpringBoot中如何监听两个不同源的RabbitMQ消息队列

    spring-boot如何配置监听两个不同的RabbitMQ 由于前段时间在公司开发过程中碰到了一个问题,需要同时监听两个不同的rabbitMq,但是之前没有同时监听两个RabbitMq的情况,因此在 ...

  10. XCTF logmein

    一.查壳 发现是64位的Linux文件(ELF可以看出是linux的文件) 二.拖入ida64,静态分析 注意这里两个坑: 1.strcpy是复制字符串的意思,前面定义的v8数组只有8个,但是后面的字 ...