循环中使用 Thread.sleep,代码评审被老板喷了。。
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
有一次我是在办公室快下班那会儿,本来想着赶紧把任务跑完就溜,结果代码评审的时候被老板直接点名喷了……就因为我在一个 他就问我,你为啥要这么写?我说调接口频率太高,想降降速,怕被限流。然后他叹了口气说,你知道你这是在干嘛吗?你是让主线程去睡觉,每个循环都等一秒,这整个服务都卡在那了你知道不?如果你这段代码跑在高并发场景,那不就全堆那了嘛。 Thread.sleep 在循环里,到底有多坑?先随手写段代码,你看个意思:
看起来没啥毛病对吧?逻辑是对的,也确实能每处理一个元素等一秒。可你要真拿这个跑个大列表,甚至你这一段代码跑在服务主线程上,那这个“等”可就是致命的慢。 **问题是它会阻塞整个线程。**你等着的时候,啥事儿都干不了。线程就像被摁住了脑袋一样,只能干等。而且这不是异步,不是定时任务,也不是限流机制,它就是“睡觉”。 那我应该怎么写?老板说,得看你目的到底是啥。如果你是为了限流,那就用限流工具,比如 Guava 的 比如用
这个写法,才是真的“控制频率”,而不是“强行睡觉”。 那些年我们错用过的 sleep我回想了下,除了循环,还有人写定时任务用 sleep:
这种用法也挺常见的。其实你如果只是想每10秒执行一次任务,为啥不用
这才是正道。而且这玩意线程池可控,还能设定任务失败之后的处理策略,比你那死循环睡觉靠谱多了。 后来老板让我回去查了一圈资料,还特意点了我们以前某次接口响应慢的问题日志,让我看看是不是我写的那段循环在 sleep,然后线程池爆了…… 真的是血的教训。我自己平时测试代码用 有时候写代码图省事,脑子里第一反应就是“我等等好了”,于是就加个 现在我只要看到有同事写循环 + sleep,我就条件反射说一句:“你是想卡主线程吗?”大家听多了也就长记性了。 -END- 阅读原文:原文链接 该文章在 2025/7/23 12:09:06 编辑过 |
关键字查询
相关文章
正在查询... |