线程的禁忌你踩坑了吗

一、暂停、恢复和停止操作对应在线程Thread的API是suspend()、resume()和stop()。
但是这些API不建议使用,因为这些方法会带来副作用。比如:suspend()方法在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入挂起状态,这样容易引发死锁。同样,stop()方法在终结一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态。
推荐配合使用Object的wait()、notify()、notifyAll()来控制线程的执行。


二、终止一个线程
1.安全的中止一个线程是其他线程通过调用某个线程A的interrupt()方法对其进行中断操作。
中断好比其他线程对该线程打了个招呼,"线程A,你要中断了",不代表线程A会立即停止自己的工作,同样的线程A完全可以不理会这种中断请求。Java里的线程默认是抢占式的,可以调用yield或join等方法变成协作式的调度。
2.线程通过检查自身的中断标志位是否被置为true来进行响应,线程通过方法isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()来进行判断当前线程是否被中断,不过静态方法Thread.interrupted()会同时将中断标识位改写为false。
3.如果一个线程处于了阻塞状态(如线程调用了Thread.sleep、Thread.join),则线程在检查中断标示时如果发现中断标示为true,则会在这些阻塞方法调用处抛出InterruptedException异常,并且在抛出异常后会立即将线程的中断标示位清除,即重新设置为false。
4.不建议自定义一个取消标志位来中止线程的运行。因为run方法里有阻塞调用时会无法很快检测到取消标志,线程必须从阻塞调用返回后,才会检查这个取消标志。这种情况下,使用中断会更好,因为:
1)一般的阻塞方法,如sleep等本身就支持中断的检查。
2)检查中断位的状态和检查取消标志位没什么区别,用中断位的状态还可以避免声明取消标志位,减少资源的消耗。
5.处于死锁状态的线程无法被中断。


三、start()方法让一个线程进入就绪队列等待分配CPU,分到CPU后才调用实现的run()方法,而且start()方法不能重复调用。


四、yield()方法:使当前线程让出CPU占有权,但让出的时间是不可设定的。也不会释放锁资源,所有执行yield()的线程有可能在进入到可执行状态后马上又被执行。


五、join方法:将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的join()方法,则直到线程A执行完毕后,才会继续执行线程B。


六、其他
1.不要依赖线程优先级,因为操作系统可能会忽略它。
2.避免在构造函数或finalize()方法中启动线程。构造函数中对象可能还未完全构造好。finalize()的调用时机不确定。
3.频繁创建销毁线程开销大,应该使用线程池,例如:ExecutorService。
4.不应在多个线程共享一个SimpleDateFormat实例,因为它不是线程安全的。
5.守护线程在JVM退出时不会阻止JVM的关闭,故不能在守护线程运行长时间执行的任务。
 


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springCahe框架

基于springboot项目 介绍:Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如: EHCache Caff…

Java-字符集-Unicode字符集

1 需求 Unicode 字符集UTF-8、UTF-16、UTF-32字符编码 2 接口 3 示例 4 参考资料

新媒体运营-----短视频运营-----PR视频剪辑----软件基础

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1.1 PR软件重置与初始化设置1.2 新建项目及序列设置1.3 PR工作区的管理方法1.4 导入4K超高清视频并与ME配合工作1…

【C语言】编译与链接

1.翻译环境与运行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 1.翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令) 2.执行环境,它用于实际执行代码 2.翻译环境 那么翻译环境是怎么将源代码…

Linux(文件系统和日志分析)

目录 1.inode & block​编辑 1.1 inode的内容 1.3 inode的号码 1.4 inode的大小 1.5 inode的特殊作用 1.6 模拟inode号被占满 2. 链接文件 3.文件恢复 3.1 修复EXT类型的文件 3.1.1 EXT类型文件恢复步骤 3.2 修复XFS类型的文件 1.inode & block 1.1 in…

算法应用实例:最大子列和问题

给定N个整数的序列{A1,A2,……AN},求函数的最大值。 分析:求该序列中最大的连续子列和,若函数最后为负数,返回0作为程序结束。 1.算法1 /*命名为MaxSubseqSum1,A[]:输入整数序列,N:整数序列里面…

7-29 删除字符串中的子串

题目链接:7-29 删除字符串中的子串 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码(python) 1. 代码实现 str1 input().split(\n)[0] str2 input().split(\n)[0] while str2 in str1:str1 str1.replace(str2, "") // 删…

第4篇:创建Nios II工程之Hello_World<三>

Q:接着我们再来完成Nios II软件工程设计部分。 A:从Quartus Tools选择Nios II Software Build Tools for Eclipse,打开Nios II SBT软件,Workspace指定到hello_world工程的software文件夹路径;再从File-->New-->…

使用STM32CubeMX对STM32F4的CAN1/2/3配置及接收中断开启

目录 1. CAN配置1.1引脚(STM32F413VGT6-LQFP100)1.2 时钟1.3 RCC配置1.4 CAN1配置1.5 CAN2配置1.6 CAN3配置1.7 输出设置 2. CAN代码2.1 CAN初始化2.2 CAN滤波器设置2.3 CAN使能2.4 激活中断2.5 CAN发送函数2.6 CAN回调函数2.7 main之后的代码 1. CAN配置…

数据分析:生存分析原理和应用实例

介绍 生存分析的目的是分析某个时间点的“生存概率”是多少。基于这样的研究目的,需要提供生存数据,它是一种由不同的开始时间和结束时间组成的事件-时间的数据,比如在癌症研究领域,研究手术到死亡的过程、治疗到疾病进展等等。 在开展生存分析前,需要了解什么是删失(c…

二维码门楼牌管理应用平台建设:隐患统计与智能管理

文章目录 前言一、二维码门楼牌管理应用平台概述二、隐患统计功能的重要性三、隐患统计的实现方式四、隐患统计的实践应用五、面临的挑战与未来发展 前言 随着城市管理的不断升级,二维码门楼牌管理应用平台已成为现代城市管理的重要工具。该平台通过集成先进的信息…

WCH RISC CH32V303RCT6 单片机的SDI Printf 虚拟串口功能 类似SEGGER RTT打印功能 简单分析

参考: 有关于 SDI printf 更多的信息和资料吗? 关于 CH32 系列 MCU SDI 虚拟串口功能的使用 【CH32X035 评估板测评】 教你使用 SDI 接口重定向 printf SDI (Serial Data Interface) 是沁恒微电子 RISC-V 内核的私有外设接口,CH32 RISC-V 系列目前提供了…

PDCA循环:持续精进的工具

文章目录 一、什么是PDCA二、PDCA的应用场景三、PDCA在信息系统项目管理中的应用 一、什么是PDCA PDCA循环是由美国质量管理专家沃特阿曼德休哈特(Walter A. Shewhart)在20世纪30年代提出的,最初用于制造业的质量管理。休哈特博士在构想PDCA…

二极管钳位型三电平SVPWM(羊角波)闭环系统simulink建模与仿真

整理了二极管钳位型三电平SVPWM(羊角波)闭环系统simulink建模与仿真模型,附赠参考资料。 在二极管钳位型三电平SVPWM中,通过控制逆变器的开关器件(IGBT)的导通和关断,将输入的直流电压转换为三…

知网怎么查重 知网查重的详细步骤

知网查重八个步骤:1. 访问官网,注册账号。2. 上传待查文档。3. 选择查重规则。4. 选择相似来源库。5. 提交查重任务。6. 等待查重结果。7. 获取查重报告。8. 下载查重报告。 知网查重的详细步骤 第一步:进入知网查重系统 打开浏览器&#x…

怎样将便签软件搬家?便签迁移攻略

便签软件已成为我们日常生活中不可或缺的记录工具。无论是重要的工作内容,还是琐碎的生活事务,我们都会在便签中一一记下。然而,当我们需要更换电脑或其他设备时,如何将这些珍贵的便签内容迁移到新设备上,成为了许多人…

2024全国大学生高新技术竞赛——算法智星挑战赛 解题报告(流水账版) | 珂学家

前言 评价 因为第一届的缘故吧,导致这场比赛异常的简单。所以不太好评价这块。 怎么说呢? 体验有点差 题目难度没有区分度有两题还存在SPJ判定问题,导致赛时没一人过。 题目分布,简单题占大部分,中等级占一小部分&…

Ubuntu查看端口状态

完蛋了,好像动心了,近一周吃啥东西都索然无味,这可如何是好!!!不知道在期待什么,恐惧与窃喜—— 在Ubuntu系统中,查看某个端口是否被放行(即允许流量通过)&am…

【JAVA进阶篇教学】第六篇:Java线程中状态

博主打算从0-1讲解下java进阶篇教学,今天教学第六篇:Java线程中状态。 理解并掌握线程的休眠、停止和挂起等操作是多线程编程中的重要内容。下面我将详细说明这些操作,并提供相应的代码案例。 目录 一、线程休眠(Thread Slee…

一个早安寄语打卡的小程序技术分享

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 1.早起打卡还能赚钱? 是的,你没有听错,最近发现了个非常有意思的小程序,主要是让用户早起早睡,然后每天进行打卡操作的。 当然&…