并发-判断线程对象是否处于活动状态 - isAlive

ops/2024/9/23 7:50:48/
  • t.isAlive() 测试线程t是否处于活动状态,只要线程启动并且没有终止,方法返回值就是true
  • start()之前,线程不处于活动状态,之后就处于活动状态
  • 示例:
  • 运行结果:
  • 但是事情并没有这么简单,先来看一下以下代码执行后t1的isAlive()方法返回:
  • 运行结果:
  • 可以看到t1已经结束了,但t1的isAlive()方法返回的是true
  • 产生这个现象的原因是isAlive()需要拿到当前对象的锁
  • 注意上面代码中t2里对t1对象进行了synchronized
  • 即t1线程在结束时需要修改自己的状态
  • 而t1的被t2锁住,所以无法修改状态,导致isAlive()返回true
  • 上述具体原因:
  • 我们可以看java.lang.Thread.isAlive()方法的实现
  • 可以看到这是个本地方法
  • 对应到jdk源码中java_lang_Thread::is_alive方法调用
  • 其底层实现是取当前线程对象中_eetop_offset的值
  • 不为空则返回true
  • 同时_eetop_offset会在调用java.lang.Thread.start()方法时,在jdk源码中,通过native_thread->prepare(jthread)的prepare方法设置为当前线程对象
  • java线程结束时,jvm会调用JavaThread::exit方法
  • ObjectLocker就是传说中的synchronized的实现,其构造函数如下:
  • 所以,在执行线程的退出过程中,需要拿到当前对象的锁之后才能设置_eetop_offset
  • 上面的例子中,由于t1的锁被t2持有,所以t1无法设置_eetop_offset值为空
  • 所以这时候isAlive()方法返回的就还是true,当然线程状态也无法修改为TERMINATED终止

http://www.ppmy.cn/ops/41780.html

相关文章

win11家庭中文版安装docker,报错 Docker Engine stopped

先引一下这位博主的链接超详细Windows11家庭中文版系统安装Docker-20230401_windows11安装docker-CSDN博客,我到前五步(跳出页面重启)和博主都是一样的,但是第六步我并没有报错,直接跳出docker界面 记录一下我的解决办法,首先按照…

Android APP读写外置SD卡无权限 java.io.IOException: Permission denied

在物联网应用里,app需要对挂载SD卡读写文件,从 Android 4.4(KitKat)版本开始,Google 引入了一项名为 "Storage Access Framework" 的新功能,该功能限制了应用对外部存储的直接读写权限,要不然就是…

Java面试八股之为什么要使用克隆

Java中为什么要使用克隆?怎么实现对象的克隆?深拷贝和浅拷贝的区别是什么 在Java中使用克隆主要有以下几个原因: 创建对象副本:克隆可以快速创建一个与原对象状态完全相同的副本,无需手动逐一复制每个属性。这种情况…

windows 10安装 docker desktop

升级 windows 10 windows 10 升级到 20H2,如 20H2 19045.4291。 注意:需返回更新,重启计算机,确保更新完整。 bios 开启虚拟化 开启cpu虚拟化功能。 windows 启用功能 启用hyper-v 启用 wsl 安装 wsl https://learn.microso…

【SpringBoot】SpringBoot整合jasypt进行重要数据加密

📝个人主页:哈__ 期待您的关注 目录 📕jasypt简介 🔥SpringBoot使用jasypt 📂创建我需要的数据库文件 📕引入依赖 🔓配置数据库文件(先不进行加密) 🌙创…

xxljob分片广播+多线程实现高效定时同步elasticsearch索引库

需求:为了利用elasticsearch实现高效搜索,需要将mysql中的数据查出来,再定时同步到es里,同时在同步过程中通过分片广播多线程提高同步数据的效率。 1. 添加映射 使用kibana添加映射 PUT /app_info_article {"mappings&quo…

C语言学习【printf函数和scanf函数】

C语言学习【printf函数和scanf函数】 printf()函数和scanf()函数可以让用户与程序交流,是输入/输出函数 printf()函数 请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如,打印整数时使用%d,打印字符时使用%c。这些符号被称…

基于单片机的智能安防系统设计(32+4G+WIFI版)-设计说明书

设计摘要: 本设计基于STM32单片机,旨在实现一个智能安防系统,主要包括烟雾和温度传感器、人体红外传感器、显示屏、按键、4G模块和WiFi模块等组件。通过这些组件的协作,实现了火灾检测、入侵监测、状态显示、用户交互和远程通信等…