LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

循环中使用 Thread.sleep,代码评审被老板喷了。。

admin
2025年7月22日 21:36 本文热度 44

有一次我是在办公室快下班那会儿,本来想着赶紧把任务跑完就溜,结果代码评审的时候被老板直接点名喷了……就因为我在一个 for 循环里用了 Thread.sleep(1000),还挺自信地说“这能稳定节奏”。

他就问我,你为啥要这么写?我说调接口频率太高,想降降速,怕被限流。然后他叹了口气说,你知道你这是在干嘛吗?你是让主线程去睡觉,每个循环都等一秒,这整个服务都卡在那了你知道不?如果你这段代码跑在高并发场景,那不就全堆那了嘛。

Thread.sleep 在循环里,到底有多坑?

先随手写段代码,你看个意思:

for (String item : items) {
    process(item);
    Thread.sleep(1000); // 等一秒
}

看起来没啥毛病对吧?逻辑是对的,也确实能每处理一个元素等一秒。可你要真拿这个跑个大列表,甚至你这一段代码跑在服务主线程上,那这个“等”可就是致命的慢。

**问题是它会阻塞整个线程。**你等着的时候,啥事儿都干不了。线程就像被摁住了脑袋一样,只能干等。而且这不是异步,不是定时任务,也不是限流机制,它就是“睡觉”。

那我应该怎么写?

老板说,得看你目的到底是啥。如果你是为了限流,那就用限流工具,比如 Guava 的 RateLimiter,或者 Spring Cloud 的 Sentinel。如果你是为了错峰访问,那应该考虑定时任务,或者批处理。

比如用 RateLimiter 控个节奏:

RateLimiter limiter = RateLimiter.create(1.0); // 每秒1个许可

for (String item : items) {
    limiter.acquire(); // 阻塞直到拿到许可
    process(item);
}

这个写法,才是真的“控制频率”,而不是“强行睡觉”。

那些年我们错用过的 sleep

我回想了下,除了循环,还有人写定时任务用 sleep:

while (true) {
    doSomething();
    Thread.sleep(10000);
}

这种用法也挺常见的。其实你如果只是想每10秒执行一次任务,为啥不用 ScheduledExecutorService

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() -> {
    doSomething();
}, 010, TimeUnit.SECONDS);

这才是正道。而且这玩意线程池可控,还能设定任务失败之后的处理策略,比你那死循环睡觉靠谱多了。

后来老板让我回去查了一圈资料,还特意点了我们以前某次接口响应慢的问题日志,让我看看是不是我写的那段循环在 sleep,然后线程池爆了……

真的是血的教训。我自己平时测试代码用 sleep 啥的没在意,可一上线环境不一样,线程池资源宝贵,一下堆满就宕机。

有时候写代码图省事,脑子里第一反应就是“我等等好了”,于是就加个 Thread.sleep。可你得想清楚:你等的是谁?在哪等?别人等得起吗?如果你等的是主线程,或者高并发下的处理逻辑,那你这“一秒”很可能就是灾难。

现在我只要看到有同事写循环 + sleep,我就条件反射说一句:“你是想卡主线程吗?”大家听多了也就长记性了。

-END-


阅读原文:原文链接


该文章在 2025/7/23 12:09:06 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved