深圳建设培训中心网站,网站建设制作介绍河南,163网站建设,自己做彩票网站犯法吗文章目录 前言原因是否正确方案是否合理定时轮询场景事件机制等待和唤醒 个人简介 前言
最近逛 CSDN 看到一篇文章#xff0c;文章大意是说为什么在循环中不推荐使用 sleep 操作#xff0c;原因在于线程挂起和唤醒会有很大的性能消耗#xff0c;并推荐使用 Timer 及 Schedu… 文章目录 前言原因是否正确方案是否合理定时轮询场景事件机制等待和唤醒 个人简介 前言
最近逛 CSDN 看到一篇文章文章大意是说为什么在循环中不推荐使用 sleep 操作原因在于线程挂起和唤醒会有很大的性能消耗并推荐使用 Timer 及 ScheduledExecutorService 方案进行优化下面我简单复现一下具体代码大家思考一下原文的原因以及解决方案是否合理
public class Demo {private static final boolean FLAG true;public static void main(String[] args) {while (FLAG) {try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}}// do something}
}上面的代码你可能会得到下面的警告
Call to ‘Thread.sleep()’ in a loop, probably busy-waiting
// 循环中调用 sleep 可能会导致忙等待
// 如 FLAG 变量状态未改变 那么线程可能一直循环并不断进行线程挂起和唤醒原因是否正确
主要原因和原文博主所说有很大的关系但不完全正确我们都知道 Java 线程实际对应着操作系统中的一个线程对线程的挂起和唤醒是一个很耗性能的操作因此我们需要避免对线程进行挂起和唤醒但还一个重要的原因是忙等待如上文所示 FLAG 变量的状态可能永远不会被改变那么线程将会不断进行挂起和唤醒进入忙等待状态造成资源的浪费。
方案是否合理
记住一点讨论方案永远不能脱离场景没有一种方案可以适应所有的场景我们永远只是在探讨适合当前场景的方案。因此原文博主只是提供了一些场景下的方案下面我们结合一些具体的场景来探讨一些可行的方案
定时轮询场景
定时轮询的场景我们可以采用博主提供的思路比如 Timer 及 ScheduledExecutorService 或者其它一些定时机制方案。
比如微服务体系中客户端上报实例状态或者服务端检测客户端状态都会使用定时轮询的机制。事件机制
上文的场景我更推荐事件机制进行解耦当变量被改变时发送变量修改事件进行处理如常见的 Spring Event 或者其它事件推送框架。
比如一些用户登录场景当用户登录状态改变时发送登录事件进行后续处理比如登录通知等等等待和唤醒
等待和唤醒机制一般适用于等待时间较长的场景因为等待和唤醒是一个性能消耗比较大的操作在等待时间不是很长的场景可以使用轮询机制避免线程频繁的挂起和唤醒。
在 Java AQS 等待获取锁和线程池任务为空等待新任务时会使用等待和唤醒操作
轮询机制 和 等待和唤醒 一般会结合使用避免线程频繁的挂起和唤醒。个人简介 你好我是 Lorin 洛林一位 Java 后端技术开发者座右铭Technology has the power to make the world a better place. 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。 作为一个 Java 后端技术爱好者我不仅热衷于探索语言的新特性和技术的深度还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。 在我的博客上你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法以帮助你更好地掌握Java编程。 我鼓励互动和建立社区因此请留下你的问题、建议或主题请求让我知道你感兴趣的内容。此外我将分享最新的互联网和技术资讯以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进一起探讨技术世界的无限可能性。 保持关注我的博客让我们共同追求技术卓越。