详细讲讲Java线程的状态
TERMINATED状态 是什么状态?
在Java线程的生命周期中,TERMINATED状态是线程的最终状态,表示线程已经执行完毕并已经退出。当一个线程完成了它的工作,或者因为异常而提前结束时,它会进入TERMINATED状态。此时线程不再执行任何代码,并且无法回到任何其他状态。
线程在进入TERMINATED状态之前,可能会先进入WAITING、TIMED_WAITING或BLOCKED状态,具体取决于它在结束之前是否被阻塞或处于等待状态。
在TERMINATED状态下,线程的所有资源都被释放,包括内存和CPU时间等资源。当线程进入此状态时,线程对象将被垃圾回收器回收,因为它已经没有任何可用的引用指向它。
BLOCKED 是什么状态?
在Java线程的生命周期中,BLOCKED状态表示线程正在等待锁定资源,以便进入同步代码块或方法进行访问。当线程尝试访问另一个线程已经持有锁的同步代码块或方法时,它将进入BLOCKED状态。
例如,当一个线程进入synchronized方法或代码块时,它将持有该对象的锁。如果另一个线程尝试访问相同的synchronized方法或代码块,它将进入BLOCKED状态,直到第一个线程释放锁。
在BLOCKED状态下,线程是活动的,它在等待锁资源变得可用时将被唤醒并重新进入RUNNABLE状态,以继续执行代码。
BLOCKED状态是一种暂时性状态,因为当线程获得了锁资源时,它将离开BLOCKED状态并进入RUNNABLE状态。因此,在Java中,BLOCKED状态通常被视为RUNNABLE状态的一种子状态。
TIMED_WAITING 是什么状态?
在Java线程的生命周期中,TIMED_WAITING状态表示线程正在等待某个特定时间内的某个事件发生,例如休眠(sleep)、等待(wait)、加锁(lock)等待超时、定时器(timer)等待、IO等待等操作。
当一个线程在调用Thread.sleep()、Object.wait()、Lock.tryLock(long timeout, TimeUnit unit)等方法时,线程将进入TIMED_WAITING状态,并在指定的时间内等待相应的事件发生。
例如,线程可以在一个Object的监视器上调用wait(long timeout)方法并指定等待时间,以等待另一个线程调用notify()或notifyAll()方法。
在TIMED_WAITING状态下,线程是暂时阻塞的,但仍然是活动的,因为它等待某个事件的发生。当事件发生或指定时间到期时,线程将离开TIMED_WAITING状态,并进入RUNNABLE状态,以便继续执行代码。
值得注意的是,与WAITING状态不同,TIMED_WAITING状态是有时间限制的,如果等待的时间超过了指定的时间,线程将自动离开TIMED_WAITING状态,进入RUNNABLE状态,以继续执行代码。
NEW是什么状态?
在Java线程的生命周期中,NEW状态表示线程已经被创建,但还没有启动(start)。在这种状态下,线程对象已经被创建,但它尚未开始执行任何代码。
当创建线程对象并调用start()方法时,线程将从NEW状态转换到RUNNABLE状态,并开始在自己的线程栈上执行代码。
需要注意的是,NEW状态只是短暂的,线程创建之后很快就会进入RUNNABLE状态。如果线程创建后很长时间仍然停留在NEW状态,可能是因为线程没有被正确地启动或因为线程启动时发生了异常。
RUNNABLE是什么状态?
在Java线程的生命周期中,RUNNABLE状态表示线程已经被启动并正在等待CPU时间片来执行代码。在这种状态下,线程正在运行或准备运行,但可能被挂起以让其他线程运行。
在RUNNABLE状态下,线程已经准备好执行代码,并且可以被操作系统调度为运行状态。当线程被调度并获得CPU时间片时,它将进入运行状态,并在自己的线程栈上执行代码。
值得注意的是,在RUNNABLE状态下,线程可能正在等待某些资源,例如锁、I/O操作等,因此可能会被挂起。如果线程因为某些原因被阻塞,它将进入BLOCKED或WAITING或TIMED_WAITING状态。一旦线程获得了所需的资源或等待的事件发生,它将重新进入RUNNABLE状态,等待CPU时间片来执行代码。
表示当前线程正在运⾏中。处于RUNNABLE状态的线程在Java虚拟机中运⾏,也有可能在等待其他系统资源(⽐如I/O)。
Java线程的RUNNABLE状态其实是包括了传统操作系统线程的ready和running两个状态的。
总之,RUNNABLE状态是Java线程生命周期中最重要和最常见的状态之一,表示线程已经准备好执行代码并正在等待执行机会。
WAITING 是什么状态?
在Java线程的生命周期中,WAITING状态表示线程正在等待某个特定的事件发生,例如等待另一个线程执行完毕或等待某个资源可用。在WAITING状态下,线程是暂时阻塞的,但仍然是活动的,因为它在等待某个事件的发生。
在WAITING状态下,线程可能会调用一些等待方法,例如Object.wait()或Thread.join()等,以等待其他线程的信号或事件发生。当这些方法被调用时,线程将进入WAITING状态,并一直等待,直到其他线程发出相应的信号或事件发生。
需要注意的是,与TIMED_WAITING状态不同,WAITING状态是没有时间限制的,线程将一直等待直到事件发生。如果没有其他线程发出相应的信号,线程将一直停留在WAITING状态,直到应用程序被终止或线程被中断(interrupt)。
在某些情况下,WAITING状态下的线程可能会被操作系统挂起,因为它并没有占用CPU时间片,因此系统可以将CPU时间片分配给其他线程。当等待的事件发生时,线程将被重新调度,并进入RUNNABLE状态,以便继续执行代码。
相关文章:
详细讲讲Java线程的状态
TERMINATED状态 是什么状态? 在Java线程的生命周期中,TERMINATED状态是线程的最终状态,表示线程已经执行完毕并已经退出。当一个线程完成了它的工作,或者因为异常而提前结束时,它会进入TERMINATED状态。此时线程不再执…...
企业月结快递管理教程
回答这个问题的之前,我们先来看看什么是企业月结快递管理...... 经济的发展,技术的进步,电商行业的加持之下,这几年快递行业的发展有目共睹。不仅是我们的生活离不开快递,很多企业的运作多多少少也离不开“快递”二字…...
cm cdp告警 Swap Memory Usage Suppress...
原因:服务器没有关swap,服务使用了swap 在cdp集群中,一般要关掉swap,如果没有关。可以使用 下面命令设置程序尽可能不使用swap,使用swap会影响性能 修改后,重启服务就不会使用swap了 sysctl -w vm.swappi…...
3.8——友元
类的主要特点之一是信息隐藏和封装,即类的私有成员和保护成员只能在定义的范围内使用,也就是说私有成员和保护成员只能通过类的成员函数来访问。但是,有时候我们在类外也需要访问私有成员数据或保护成员数据怎么办。这时我们就要通过友元函数…...
C++ OOP Feature Conclusion (更新中)
目录 1.类与对象 1.1 基本概念(继承、封装、抽象、多态) 1.2类的声明 1.3成员函数(对象所占空间取决于数据成员,和成员函数无关) 1.4数据成员(不能在类中初始化) 1.5构造与析构函数(…...
【HTTP】Cookie、Session、Token以及Cookie优化
Cookie、Session、TokenCookie优化Cookie、Session、Token 在开始介绍Cookie安全之前,我们先来了解一下实现授权的方式。 在登录功能中,为了记住登录成功后的信息,在客户端,我们通常会使用Cookie来记录,但是…...
npm之报错:Error: EACCES: permission denied, access ‘/usr/local/lib/node_modules‘
1.报错 363 error [Error: EACCES: permission denied, rename ‘/usr/local/lib/node_modules/tldr’ -> ‘/usr/local/lib/node_modules/.tldr-8nq4AGAt’] { 363 error errno: -13, 363 error code: ‘EACCES’, 363 error syscall: ‘rename’, 363 error path: ‘/usr/…...
「SQL面试题库」 No_30 超过5名学生的课
🍅 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试࿰…...
自定义maven插件,在项目中命令启动springboot并加载当前项目资源
背景 最近在制定团队内公用的基础框架,基于单应用多module的架构思路,使用maven管理项目依赖,在项目中定义了一个springboot模块,该模块依赖具体的业务实现模块,启动后通过扫描路径下的类加载服务,业务开发…...
Linux系统【Centos7】更新内核更新软件详细教程
更新内核: 1. 打开终端,输入命令 sudo yum update,等待更新完成。 2. 重启系统,输入命令 sudo reboot。 3. 在 GRUB 引导界面,选择最新的内核版本,按下回车键进入系统。 4. 在终端中输入命令 uname -r&…...
C++ 中new/delete与malloc/free详解
文章目录前言一、new/delete1. 序言2. 使用方法2.1. new 和 delete 基本语法2.2. new 和 delete 的底层实现原理3. 底层原理3.1. operator new 和 operator delete3.2. new 和 delete 的底层实现原理4. 注意事项5. 总结二、malloc/free1. 序言2. 使用方法2.1. malloc 和 free 基…...
crm软件哪个好?该如何选择?
crm软件哪个好?该如何选择? 首先我们需要明确一下什么是好的CRM系统,优质的CRM系统应该具备以下优势: 1)提高销售效率:通过CRM系统,销售人员可以跟踪客户互动历史和交易记录,了解客…...
蓝桥杯第22天(Python)(疯狂刷题第5天)
题型: 1.思维题/杂题:数学公式,分析题意,找规律 2.BFS/DFS:广搜(递归实现),深搜(deque实现) 3.简单数论:模,素数(只需要…...
软件测试面试常问的问题有哪些?
互联发展是很快的,每年都会有新语言的诞生。 我干测试已经三年了,主要负责web功能测试,java编写接口自动化,APP功能测试,APP 接口自动化(也是用的java),面过得测试也差不多30个&…...
js之文件信息读取篇高级基础
文章目录js之文件信息读取(FileReader)获取文件相关信息的两种方式js原生拖拽事件js之文件信息读取(FileReader) 首先这里面会讲一些知识点 bolb 对象FileReader对象 let blob new Blob([heewwekgewgwer], { type: text/plain …...
SQL Server的死锁说明
死锁指南一、了解死锁二、检测并结束死锁2.1、可能死锁的资源三、处理死锁四、最大限度地减少死锁4.1、以相同的顺序访问对象4.2、避免事务中的用户交互4.3、保持交易简短且在一个批次中4.4、使用较低的隔离级别4.5、使用基于行版本控制的隔离级别4.6、使用绑定连接4.7、停止事…...
关于#define的一些小知识
目录 一,#define的声明格式: 二,#define宏的作用是为了完成替换 #define的替换规则: 三,#define使用时常犯的错误 四,宏与函数的比较 4.1,什么时候使用宏? 4.1,…...
rabbitmq普通集群与镜像集群搭建
1.准备三台centos7主机,并关闭防火墙与selinux 2.安装rabbitmq环境必备的Erlang(以下所有操作三台主机均需要执行) 执行以下命令下载配置erlang yum源 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash使用yum命…...
session和jwt哪个更好
session和jwtsession优点缺点jwt优点缺点总结session 优点 原理简单,易于学习。用户信息存储在服务端,可以快速封禁某个用户。 缺点 占用服务端内存,硬件成本高。多进程,多服务器时,不好同步-需要使用第三方缓存&a…...
基于TPU-MLIR实现UNet模型部署-决赛答辩02
队伍:AP0200023 目录 初赛 一、 模型导出优化 1.1 直接倒出原始模型并转换 1.2 导出模型前处理 1.2.1 导出Resize 1.2.2 导出归一化 1.3导出模型后处理 1.3.1导出 Resize 与 1.3.2导出 ArgMaxout 1.3.3导出特征转RGB 复赛 一、 确定baseline 二、优化模…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
