Java线程状态与状态转换

news2025/1/19 8:00:07

前言

在Java中,线程是多任务处理的基本单位,它可以并行执行多个任务。线程的状态描述了线程在其生命周期中的不同阶段。Java线程的状态可以分为以下几种:

线程状态

状态解释
新建状态(New)线程被创建但尚未启动
就绪状态(Runnable)线程已经创建并调用了start()方法,但仍然需要等待CPU的执行时间
运行状态(Running)线程获得了CPU的执行时间,正在执行任务
阻塞状态(Blocked)线程因为某些原因被暂停执行,例如等待输入、等待其他线程的锁释放等
等待状态(Waiting)线程因为等待某个条件满足而暂停执行,例如等待其他线程的通知
定时等待状态(Timed Waiting)线程因为等待某个条件满足一段指定的时间而暂停执行
终止状态(Terminated)线程已经执行完任务或因异常而终止

这些状态定义在枚举 java.lang.Thread.State 上:

public enum State {
        NEW,
        RUNNABLE,
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;
}

很多文章都是指说理论,我这里直接贴代码,运行以下代码就能打印线程的 6 种状态:

public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            Thread t = Thread.currentThread();
            System.out.println("就绪状态:" + t.getState());
            LockSupport.park();
            // 200 毫秒
            LockSupport.parkNanos(200000000);

            synchronized (Object.class) {
                // 空实现即可
            }
        });

        // 让另一个线程获取到锁,这样就能模拟线程1阻塞
        new Thread(() -> {
            synchronized (Object.class) {
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();

        System.out.println("新建状态: " + t1.getState());
        t1.start();

        TimeUnit.MILLISECONDS.sleep(100);
        System.out.println("等待状态: " + t1.getState());
        LockSupport.unpark(t1);

        TimeUnit.MILLISECONDS.sleep(100);
        System.out.println("超时等待状态: " + t1.getState());

        TimeUnit.MILLISECONDS.sleep(200);
        System.out.println("阻塞状态: " + t1.getState());


        TimeUnit.SECONDS.sleep(4);
        System.out.println("终止状态: " + t1.getState());
    }

输出结果:

新建状态: NEW
就绪状态:RUNNABLE
等待状态: WAITING
超时等待状态: TIMED_WAITING
阻塞状态: BLOCKED
终止状态: TERMINATED

最后附上线程状态转换图(发现 process on 有比较好的图,直接用了)
在这里插入图片描述

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

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

相关文章

nginx配置IP白名单

1、添加IP白名单文件 在nginx目录的 conf 中添加文件 ip.conf,注意白名单文件不用添加任何注释,可以有空行 vi ip.conf 192.168.3.11 1;192.168.3.10 1; 192.168.0.112 1;2、配置nginx.conf 编辑http节点: http {# ...# geo IP whitelist…

一维二维水动力模拟、水质建模、复杂河网构建技术在环境影响评价、防洪评价与排污口论证等实际项目中的应用

目录 ​专题一、一维水动力模型模拟一河道水流的应用 专题二、一维复杂河网模型构建及建筑物设置 专题三、一维水质模型在环境影响评价中的应用 专题四、平面二维水动力模型的构建河验证 专题五、平面二维水动力模型在防洪影响评价中的应用 专题六、平面二维水动力水质模…

2023-07-13 Fitz完成PDF转TXT

Fitz完成PDF转TXT 前言 1、本机为Inspiron 5005,为64位,所用操作系统为Windos 10。所使用开发环境为Anaconda和jupyter notebook。 2、本教程主要实现了安装Anaconda和jupyter notebook,使用Fitz完成PDF转TXT。 Anaconda和Jupyter notebook简…

SpringCloud Alibaba——Nacos服务领域模型

目录 一、Nacos服务领域模型二、Nacos服务领域模型图解 一、Nacos服务领域模型 模型名称解释Namespace实现环境隔离,默认值publicGroup不同的service可以组成一个Group,默认值Default-GroupService服务名称Cluster对指定的微服务虚拟划分,默…

Scratch 多场景收集物品

Scratch 多场景收集物品 本程序开始运行时4种物品各复制10次并移动到随机位置,交通工具角色跟随鼠标,碰到上述4种物品后删除物品,物品清空后切换到下一个背景、更换交通工具角色并重新生成4种物品。交通工具角色的切换通过判断背景变量的值来…

ubuntu在arm平台下编译安装Qt5.15.2和PySide2(亲测可用)

一、安装Qt5.15.2 1.下载源码首先在官网下载Qt5.15.2的源码:https://download.qt.io/archive/qt/5.15/5.15.2/single/ 2.先安装编译qt的环境 sudo apt-get update sudo apt-get install build-essential sudo apt-get install libgl1-mesa-dev sudo apt-get inst…

【推荐】高效办公利器——高效工具来袭!

下载链接 https://zh.snipaste.com/download.html 软件介绍 Snipaste 是一个简单但强大的截图工具, 直接按 F1 截图 F3 贴图在屏幕,工具蓝中提供了很多功能:框选标记、折线、画笔、记号笔、马赛克、文本标注、橡皮擦、撤销、退出、截图定在…

Python爬虫——urllib_ajax的get请求爬取豆瓣电影前十页

ajax: 就是一段js代码,通过这段代码,可以让页面发送异步的请求,或者向服务器发送一个东西,即和服务器进行交互 对于ajax: 一定会有 url,请求方法(get, post),可能有数据一般使用 j…

【C++】STL——vector的简单介绍、vector的定义、vector的构造函数声明、vector iterator的使用

文章目录 1.vector的含义2.vector的使用2.1vector构造函数声明(1)vector()(2)vector(size_type n, const value_type& val value_type())(3)vector(const vector& x) (4)ve…

20230714----重返学习-DOM-diff算法-构建工具-包管理工具-Vite基本使用-Vue3新特性

day-112-one-hundred-and-twelve-20230714-DOM-diff算法-构建工具-包管理工具-Vite基本使用-Vue3新特性 DOM-diff算法 vue2中diff算法 同级比对,跨级比对性能差。而且采用的方式是递归比对,更差一点。根节点只能有一个,比对的时候会从根节…

Android 多边形导圆角(Path画折线导圆角)

前言:用path画折线,2条线相交处导圆角 简介:为开发者提供工具类,方便对使用path画折线设置圆角。使用path画多边形,如三角形、矩形、平行四边形等,同时设置圆角。另外提供计算直线上某点坐标。 实现原理 …

Matplotlib下载和安装

Matplotlib 是 Python 的第三方绘图库,它非常类似于 MATLAB。在使用 Matplotlib 软件包之前,需要对其进行安装。本节以 Windows10 系统为例,介绍 Matplotlib 的几种安装方式。 MATLAB 是一款商业软件,主要用于数据分析、图像处理…

http协议(二)

欢迎来到南方有乔木的博客!!! 博主主页:点击点击!戳一戳!! 博主名:南方有乔木呀 博主简介: 一名在校大学生,正在努力学习Java语言编程。穷且意坚,不坠青云…

Java常规写法与新特性对比详解

Java常规写法与新特性对比详解 ✨1. Lambda表达式对比常规写法:⭐️1.1 迭代集合:⭐️1.2 条件过滤:⭐️1.3 映射转换: ✨2. Stream API对比常规写法:⭐️2.1 过滤和计数:⭐️2.2 排序:⭐️2.3 …

通过 Postman+Newman+Jenkins 进行接口自动化测试和进一步实现 CI

目录 前言: Postman 部分 Collection 或者说测试集的建立 Postman 使用详解 测试工具 mock server Newman 的安装和使用 newman 的使用 对 SSL 的支持 newman 第三版以后(目前已经是 4.3.1)可以支持通过 CLI 选项来支持 SSL 对 new…

Python 使用 Stable Diffusion API 生成图片示例

代码: import base64 import datetime import json import osimport requestsdef submit_post(url: str, data: dict):"""Submit a POST request to the given URL with the given data.:param url: url:param data: data:return: response"…

用html+javascript打造公文一键排版系统6:三级标题排版

正文中的标题分为四级,文中结构层次序数依次可以用“一、”“(一)”“1.”“(1)”标注;一般第一层用黑体字、第二层用楷体字加粗、第三层和第四层用仿宋体字标注。 对于以阿拉伯数字开头、后接英文点号.及…

First image then video A two-stage network for spatiotemporal video denoising

First image then video: A two-stage network for spatiotemporal video denoising http://export.arxiv.org/abs/2001.00346 作者:王策 南开大学 本文针对的是视频中出现大运动。或者前景和背景由于弱光环境较弱时造成去噪性能差的问题而解决,论文时在…

String 类的常用方法

String类的常用方法 说明 String类是保存字符串常量的,每次更新都需要重新开辟空间,效率比较低,因此 java 设计者还提供了StringBuilder和StringBuffer来增强String的功能,并提高效率。 常用方法 public class String01 {publi…

C语言——动态内存管理(malloc, calloc, realloc, free, 柔性数组详解)

C语言——动态内存管理 1. 为什么需要动态内存管理 我们以往定义数组,都是这么定义的: int nums[10] {0};以这种方式开辟空间有两个特点: 空间开辟的大小是固定的数组在声明的时候,必须指定数组的长度,它所需要的内…