线程的禁忌你踩坑了吗

server/2024/9/18 13:38:06/ 标签: java, jvm, 开发语言, 面试

一、暂停、恢复和停止操作对应在线程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.ppmy.cn/server/21601.html

相关文章

大田场景下的路径检测论文汇总

文章目录 2020Visual Servoing-based Navigation for Monitoring Row-Crop Fields 2020 Visual Servoing-based Navigation for Monitoring Row-Crop Fields code: https://github.com/PRBonn/visual-crop-row-navigation 摘要: 自主导航是野外机器人执行精确农业…

第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-->…

Redis入门到通关之数据结构解析-SkipList

文章目录 ☃️概述☃️总结 欢迎来到 请回答1024 的博客 🍓🍓🍓欢迎来到 请回答1024的博客 关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开发者。 博客特色&…

计算机服务器中了helper勒索病毒怎么办,helper勒索病毒解密流程工具

在网络技术飞速发展的今天,越来越多的企业离不开网络,网络可以为企业带来更高的生产效率,提供更多的便捷服务,但网络是一把双刃剑,在为人们提供便利的同时,也为企业的数据安全带来严重威胁。近日&#xff0…

Python-100-Days: Day04 循环结构

应用场景 写程序会遇到重复执行或者特定的指令的场景。这些场景通常是可以使用循环结构进行处理的。 循环结构就是程序中控制某条或某些指令重复执行的结构。在Python中构造循环结构有两种做法,一种是for-in循环,一种是while循环。 for-in循环 若明确…

【Hadoop】- MapReduce概述[5]

目录 前言 一、分布式计算框架 - MapReduce 二、MapReduce执行原理 前言 MapReduce是一种分布式计算框架,由Google开发。它的设计目标是将大规模数据集的处理和生成任务分布到一个由廉价计算机组成的集群中。 在MapReduce模型中,输入数据被分割成若…

多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测

多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测 目录 多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现WOA-LSSVM鲸鱼算法优化…

装饰器模式【结构型模式C++】

1.概述 装饰器模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件(Concre…

由于找不到msvcr120.dll,无法继续执行代码

在日常编程中,缺少关键的msvcr120.dll文件可能会导致代码无法执行,给我们带来不便。针对缺少msvcr120.dll文件的情况,我们可以采取一些有效的解决方法来解决这一问题。通过下载安装或使用Visual C Redistributable工具安装该msvcr120.dll文件…

Vue入门到关门之计算属性与监听属性

一、计算属性 1、什么是计算属性 计算属性是基于其它属性计算得出的属性,就像Python中的property,可以把方法/函数伪装成属性,在模板中可以像普通属性一样使用,但它们是基于响应式依赖进行缓存的。这意味着只有在依赖的响应式数…

电力调度自动化系统,如何减少配电安全隐患?

“双碳”战略目标下,数据中心迎来了更多发展机遇,同时电力调度自动化系统也迎来更多挑战,如何保障持续稳定的电力供应、确保关键负载的可靠运行,并兼顾数字化管理、绿色可持续转型等等议题成为数据中心行业构建未来领导力的重要关…

Eureka 详解:构建高可用微服务架构

目录 引言 一.Eureka 简介 二.关键概念和组件 1.服务注册 2.服务发现 3.Eureka 服务器 4.服务注册表 5.续约 6.负载均衡 7.故障转移和容错 8.集群和复制 9.服务元数据 三.Eureka 的工作原理 四.Eureka 的优势 五.实例:使用 Eureka 的微服务架构 步骤…

拖尾渲染器-Unity拖尾渲染器的使用

Unity拖尾渲染器是一种特效组件,用于在游戏中创建拖尾效果。它可以用于模拟物体的运动轨迹、增加动感和视觉效果。以下是Unity拖尾渲染器的使用方法: 添加拖尾渲染器组件:在Unity编辑器中,选中需要添加拖尾效果的游戏对象&#xf…

Rust腐蚀服务器搭建架设教程ubuntu系统

Rust腐蚀服务器搭建架设教程ubuntu系统 大家好我是艾西一个做服务器租用的网络架构师。Rust腐蚀游戏对于服务器的配置有一定的要求很多小伙伴就思考用linux系统搭建的话占用会不会小一点,有一定电脑基础的小伙伴都知道Linux系统和windows系统相比较linux因为是面板…

docker数据管理(一)

一、需要docker数据管理的原因 因为数据写入后如果停止了容器,再开启数据就会消失。使用数据管理的数据卷挂载,实现了数据的持久化,重启数据还会存在。 容器之间共享文件即相当于有个备份,也会解决停止容器后数据消失的问题。 二、…

CSS常用属性之(列表、表格、鼠标)属性,(如果想知道CSS的列表、表格、鼠标相关的属性知识点,那么只看这一篇就足够了!)

前言:在学习CSS的时候,必不可少的就要学习选择器和常见的属性,而本篇文章讲解的是CSS中的列表、表格、背景、鼠标属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 大致了解一下本篇文章…

利用Java Stream API高效判断List中是否存在字段值为0的元素

利用Java Stream API高效判断List中是否存在字段值为0的元素 引言场景一:简单Integer List场景二:复杂对象List场景三:多字段判断总结 引言 在日常编程中,我们经常需要对集合(如List)中的元素进行条件判断。…

uniapp制作安卓原生插件踩坑

top. fireEvent失效的问题 本来我项目跑的好好的,结果放到公司项目半天收不到回调 结果是因为vue3 方法 onTel会变成on-tel 全部改小写才行了 1.uniapp和Android工程互相引用讲解 uniapp原生Android插件开发入门教程 (最新版)_uniapp and…

Axure琐碎细节

文章目录 琐碎细节注释预览编写原型图的时候可以把颜色改为灰色标尺竖直文字左对齐Axure中的文字怎么添加元件层级问题如何找到各种各样的形状,比如三角形了 五角星了 十字架了给按钮设置简单的交互动作通过锁来等比例缩放 琐碎细节 注释 有时候我们需要给我们的元…

游戏新手村20:游戏落地页广告页如何设计

在互联网营销中,着陆页(Landing Page,有时被称为首要捕获用户页)就是当潜在用户点击广告或者搜索引擎搜索结果页后显示给用户的网页,LandingPage对于游戏广告的转化率和重要性就不言而喻了。 网页游戏LP页面 上图就是我们大家在浏览网站时不小心蹦出或者主动点击某…