Java 线程的几种状态及其切换的条件

news2024/11/23 15:49:51

  • 1.线程状态及其含义
  • 2.状态之间切换的条件

1.线程状态及其含义

  1. NEW(初始化): 表示创建了Thread对象,但是还没有调用start (也就是系统内核还是没有创建对应的PCB)

  2. RUNNABLE(运行): 表示可运行的.线程创建后,调用了start方法,等待CPU的调度或者正在CPU中运行.

  3. BLOCKED(阻塞): 表示该线程进入阻塞队列.

  4. WAITING(等待):该线程调用了wait()方法后进入阻塞队列,等待其他线程唤醒.

  5. TIMED_WAITING(超时等待): 表示该线程等待(阻塞)一定的时间后,自动返回(自己醒来了).

  6. TERMINATED(终止): 表示内核中的PCB已经执行完毕了,但是Tread对象还存在(依旧可以调用一些方法,但是不能使用多线程,也就无意义了).表示线程执行完毕或者run()因异常退出,该线程结束了生命周期.

  • 使用State(枚举)查看状态

在这里插入图片描述

  • 代码
public class ThreadDemo13 {
    public static void main(String[] args) {
        for(Thread.State state: Thread.State.values() ){
            System.out.println(state);
        }
    }
}

2.状态之间切换的条件

在这里插入图片描述

  • 观察线程状态的切换:NEW / RUNNABLE / TIMED_WAITING / TERMINATED
public class ThreadDemo14 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            for (int i = 0; i < 1000; i++) {
                //循环里来一个sleep  此时获取状态 是 TIMED_WAITING
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        //启动前 获取到 NEW
        System.out.println("start之前:"+t.getState());
        //启动线程
        t.start();
        //这个循环的目的是:此时t线程在sleep中获取的状态 可能是RUNNABLE 也可能是 TIMED_WAITING
        //循环获取状态 总会把这两种状态都获取到  具体获取到哪个状态取决于系统调度
        // t线程当前运行到哪个环节了 是在执行(for循环) 还是在sleep
        for (int i = 0; i < 20; i++) {
            System.out.println("t线程执行中状态:"+t.getState());
        }
        //让main线程等待t线程
        t.join();
        //任务结束后 获取到 TERMINATED
        System.out.println("t线程结束后:"+t.getState());

    }
}

代码输出结果:

在这里插入图片描述

线程的状态之间转换的条件:在创建一个新线程时并没有使用该线程调用stat方法,此时线程是NEW状态,当调用了start方法,意味着线程进入就绪状态,等待系统调度,进入到CPU或者sleep完,或者正在执行任务,此时线程是RUNNABlE状态 (就绪状态),当执行任务时,遇到了sleep(),线程不会被分配CPU资源,此时线程转是TIMED_WAITING状态(阻塞/等待状态),当线程的任务(run方法)执行完毕时,此时线程是TERMINATED状态(终止),虽然这个时候线程对象还存在,但是已经没有了意义,也不能重新start启动,并且一个线程只能调用一次start.在这的终止状态表明的是该线程在系统调度中结束了,已经不再是一个线程.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【白皮书】PROFIBUS网络诊断

PROFIBUS标准已有30多年的历史&#xff0c;如今已是一种成熟的数字现场总线技术。PROFIBUS通常用于工厂和过程自动化行业&#xff0c;也可用于食品、饮料或制药等混合行业。此外&#xff0c;其还适用于楼宇自动化和轨道交通等领域。可见&#xff0c;PROFIBUS是一种可服务于这些…

华为OD机试 - 信号发射和接收

题目描述 有一个二维的天线矩阵,每根天线可以向其他天线发射信号,也能接收其他天线的信号,为了简化起见,我们约定每根天线只能向东和向南发射信号,换言之,每根天线只能接收东向或南向的信号。 每根天线有自己的高度anth,每根天线的高度存储在一个二维数组中,各个天线…

第三方美颜sdk人脸识别的流程以及代码分析

小编曾经多次提到过人脸检测和人脸是被技术&#xff0c;那么这些算法在第三方美颜sdk中有用吗&#xff1f;答案是肯定的&#xff0c;不止有用&#xff0c;而且还非常重要。我们可以将人脸识别算法分为基础层算法与应用层算法&#xff0c;开头提到的人脸检测&#xff0c;实际上是…

Python程序设计-第1章Python程序基础

第1章Python程序基础一.预习笔记 1.1 Python简介&#xff1a; Python是一种面向对象的解释型计算机程序设计语言&#xff0c;由荷兰人Guido Van Rossum于1989年发明。Python的第一个公开发行版于1991年发行。 1.2 Python开发环境搭建&#xff1a; python解释器的安装&#…

2017 hypernetworks 笔记

HYPERNETWORKS 这篇文章来自谷歌的一篇文章 Introduction 这篇文章中提出了一种方法&#xff1a;使用一个小网络&#xff08;hypernetwork&#xff09;&#xff0c;小网络的作用是给一个larger network&#xff08;main network&#xff09;来生成权重&#xff0c;这个main ne…

结构型模式

1.代理模式 提供对象的替代品或其占位符。 代理控制着对于原对象的访问&#xff0c; 并允许在将请求提交给对象前后进行一些处理结构 抽象主题类&#xff1a;通过接口或抽象类声明真实主题和代理对象实现的业务方法真实主题类&#xff1a;实现抽象主题中的具体业务&#xff0c…

小程序API

小程序APIapi介绍api类型示例小程序api-网络请求示例合法域名npm基础应用核心步骤npm下载vant-weapp组件库核心步骤api介绍 小程序开发中&#xff0c;会使用到很多内置的功能&#xff0c;这些功能都被封装到小程序的api中了。比如 弹出提示框发送网络请求等上传文件、下载文件…

centos的官网下载和vm16虚拟机安装centos8【保姆级教程图解】

centos8的官网下载和vm16虚拟机安装centos8【保姆级图解】centos下载vm虚拟机安装centos可能出现的问题vcpu-0centos下载 centos官网&#xff1a;https://www.centos.org/ 进入官网后&#xff0c;点击Download 选择 Centos Stream 8 x86_64,并且点击进入 然后会出现国内的…

穿越寒冬 向新而行 | 智和信通2022年度年终总结大会圆满落幕

岁序更迭&#xff0c;新程再启&#xff0c;2022年在挑战与成就中谢幕。日迈月征&#xff0c;朝暮轮转&#xff0c;2023年在希望中启航。2023年1月13日&#xff0c;北京智和信通技术有限公司&#xff08;以下简称“智和信通”&#xff09;召开2022年度年终总结大会。会议全面总结…

Tp5 通过crontab 执行定时任务

声明&#xff1a;此处为ThInkCmf 为例&#xff1a;在主题中的command 中新建php文件如图在PHP文件中设置脚本名称及注释&#xff0c;并编写业务逻辑。protected $output ;/*** 作者&#xff1a;执着* 说明&#xff1a;定义脚本名称及添加注释* param setName:定义脚本名称* pa…

【Python百日进阶-数据分析】Day227 - plotly的子图

文章目录一、Plotly 图形工厂子图1.1 垂直图形工厂图表1.2 水平表格和图表1.3 垂直表格和图表二、表格和图表子图三、地理子图四、混合子图和 Plotly Express一、Plotly 图形工厂子图 Plotly 的 Python API 包含一个图形工厂模块&#xff0c;其中包含许多包装函数&#xff0c;…

可执行文件的装载

装载方式回顾一下操作系统的知识&#xff0c;程序执行的时候需要的指令和数级都必须在内存中时&#xff0c;程序才能正常运行&#xff0c;最简单的方式就是将指令和数级全部加载到内存中&#xff0c;这样肯定可以顺利执行&#xff0c;但这样的方式对内存大小来说是一个考验。因…

python中的socket网络编程

目录 一.服务端开发 1.什么是Socket网络编程 2.基于Socket完成服务端程序开发 步骤 演示 二.客户端开发 步骤 演示 一.服务端开发 1.什么是Socket网络编程 socket(简称套接字)是进程之间通信一个工具&#xff0c;好比现实生活中的插座,所有的家用电器要想工作都是基于…

Git系列:入门必备指令详解

Git系列&#xff1a;入门必备指令详解总览高频指令参考资料总览 常用指令使用流程如下图&#xff1a; workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;版本库或本地仓库remote repository&#xff1a;远程仓库 ——引用自&…

线程学习笔记

线程 出现原因 MP3多个模块放在一个进程中&#xff0c;CPU处理能力&#xff0c;播放可能不连续&#xff1b;放在多个进程中&#xff0c;资源传递、进程维护等开销很大 进程相比于进程&#xff0c;地址空间直接共享 定义 线程是进程的执行流程&#xff0c;除了线程&#xf…

WPF之调用Iconfont

一、调用iconfont 1、首先再Iconfont中新建一个项目&#xff0c;注意修改font family 2、将在线的icon添加到项目中 3、下载安装包到本地 4、更改本地的fontfamily格式如下‘./路径文件夹名/#***’ ***是指再iconfont中的fontfamily 注意如果显示为口 可能是路径不对 如果…

数据结构——栈和队列

目录 一、栈&#xff08;Stack&#xff09; 1、定义 2、顺序结构模拟实现栈和常用方法 &#xff08;1&#xff09;.栈的顺序存储 &#xff08;2&#xff09;.基本方法 3、栈的链式结构与顺序结构对比 &#xff08;1&#xff09;.对比 4、区分概念 &#xff08;1&#x…

JavaScript 库之 vanilla-tilt(一个平滑的 3D 倾斜库)

JavaScript 库之 vanilla-tilt&#xff08;一个平滑的 3D 倾斜库&#xff09;参考获取vanilla-tilt特点使用示例使用1. data-tilt2. VanillaTilt.init()优先级示例配置选项其他参考 项目描述GitHub前往Vanilla-tilt.js前往 获取 Vanilla-tilt.jsGitHubnpm npm install vanil…

【开发环境】JRE 裁剪 ② ( 裁剪 bin 目录下的 dll 动态库文件 | 压缩 rt.jar 文件 )

文章目录一、裁剪 lib 目录下的 jar 文件二、压缩 rt.jar 文件参考博客 : 精简jre1.8精简jre步骤裁剪JRE(嵌入式设备的java环境移植) 资源下载地址 ( 本篇博客的资源快照 , 不是最终版的裁剪效果 ) : https://download.csdn.net/download/han1202012/87389091 JRE 裁剪分为三…

Pytorch深度学习【十五】

微调 网络架构 一个神经网络一般可以分成两块 特征抽取将原始像素变成容易线性分割的特征线性分类器来做分类 微调 思路—将相同功能的网络及其参数直接进行迁移使用&#xff0c;而并不是通过重新学习&#xff0c;只改变部分层次即可 训练 是一个目标数据集上的正常训练任务…