前言

本次主要分享一下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. 『无为则无心』Python序列 — 18、Python列表概念及常用操作API

    目录 1.列表的概念 (1)列表的定义 (2)列表的应用场景 (3)列表的定义格式 2.列表的常用操作 (1)列表的查找 1)通过下标查找 2)通过方法查找 3)判断是否存在 (2)列表的增加 @1. ...

  2. 六QT使用mqtt

    QT官方的mqtt是qmqtt,头文件是 #include <qmqttclient.h> 官方的文档地址 https://doc.qt.io/QtMQTT/qmqttclient.htm ...

  3. Zabbix5.0Yum安装

    1.1.操作系统配置: 1.操作系统属性(虚拟机下环境): (1)操作系统版本: [root@localhost ~]# cat /etc/redhat-release CentOS Linux re ...

  4. 13、ssh跳板机

    13.1.前提条件: 1.跳板机服务器和其它服务器建立了ssh秘钥登录: 2.目前的环境: (1)各服务器上都建立了lc用户,并给于sudo (lc ALL= NOPASSWD:ALL )权限,lc就 ...

  5. 码云使用svn无法提交空文件夹

    错误信息: svn: E200015: Commit failed (details follow): svn: E200015: Empty directories is not supported ...

  6. 从S3中拷贝或同步文件

    p.p1 { margin: 0; font: 16px "Helvetica Neue"; color: rgba(53, 53, 53, 1) } p.p2 { margin: ...

  7. PYTHON PIP 快速安装

    清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https: ...

  8. python 构造函数 析构函数

    #构造函数是在对象被创建是自动调用的方法,用来完成初始化操作class Test(object): def __init__(self, name): self.name = name print(' ...

  9. 求数组的子数组之和的最大值II

    这次在求数组的子数组之和的最大值的条件下又增加了新的约束:  1.要求数组从文件读取.      2.如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保 ...

  10. [刘阳Java]_第一个Java程序_第7讲

    1. 其实第一个Java程序是很简单,但是当自己编写第一个Java程序时候需要注意如下几个内容: 理解Java程序的运行环境 校验你的Java环境变量是否能够运行你所写的第一个Java程序 理解Jav ...