前言

本次主要分享一下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. Ubuntu18.04下安装Docker并配置SSL证书加密远程连接

    Docker下载与安装 下载安装包 国内网络连接docker镜像还是比较慢的,这里推荐直接下载docker镜像,Ubuntu镜像下载路径为:https://download.docker.com/li ...

  2. NUC980 运行 RT-Thread 时使用 GPIO

    如何使用 GPIO? NuMaker-RTU-NUC980 板子引出的 IO 有: 分别有一个 I2C1.GPIO.SPI0.UART4,RT-Thread 中 NuMaker-RTU-NUC980 ...

  3. AIDL —— Android接口定义语言

    AIDL:Android Interface Definition Language,即Android接口定义语言,是Android进程间通信比较常用的一种方式.翻译一下,就是为了让某个Service ...

  4. 什么IP欺骗?

    1.什么是IP欺骗? IP欺骗是指创建源地址经过修改的Internet协议(IP) 数据包,目的要么是隐藏发送方的身份,要么是冒充其他计算机系统,或者两者兼具.恶意用户往往采用这项技术对目标设备或周边 ...

  5. 温故知新,基于Nexus3和Docker搭建私有Docker Mirrors镜像库

    前言 接着上一篇文章关于基于Nexus3和Docker搭建私有Nuget服务的探索,我们可以进一步利用Nexus3来创建一个私有的Docker镜像库满足内部需求. 仓库类型 hosted: 本地存储, ...

  6. Linux中su和sudo的用法

    su -#su - oldboy //当执行这个命令的时候表示切换到oldboy用户,并且重新读取用户环境相关配置文件,具体的来说就是执行下用户家目录下.bash_profile和.bashrc文件, ...

  7. 26、samba搭建

    26.1.samba介绍: samba是一个网络服务器,基于linux操作系统,用于linux和windows之间数据的共享: Samba是一个能让Linux系统应用Microsoft网络通讯协议的软 ...

  8. layui 小细节知识点

    1.layui-textarea 赋值总是居中 问题   需要 放在同一行 <textarea class="layui-textarea" style="text ...

  9. Python 绘制词云

    文本内容:data(包含很多条文本) 1.分词: import jieba data_cut = data.apply(jieba.lcut) 2.去除停用词: stoplist.txt:链接:htt ...

  10. webview和H5交互

    由于H5的灵活多变,动态可配的特点,也为了避免冗长 的审核周期,H5页面在app上的重要性正日益突显. iOS应用于H5交互的控件主要是UIWebView及WKWebView WKWebView是14 ...