循環(huán)中使用 Thread.sleep,代碼評審被老板噴了。。
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
有一次我是在辦公室快下班那會(huì)兒,本來想著趕緊把任務(wù)跑完就溜,結(jié)果代碼評審的時(shí)候被老板直接點(diǎn)名噴了……就因?yàn)槲以谝粋€(gè) 他就問我,你為啥要這么寫?我說調(diào)接口頻率太高,想降降速,怕被限流。然后他嘆了口氣說,你知道你這是在干嘛嗎?你是讓主線程去睡覺,每個(gè)循環(huán)都等一秒,這整個(gè)服務(wù)都卡在那了你知道不?如果你這段代碼跑在高并發(fā)場景,那不就全堆那了嘛。 Thread.sleep 在循環(huán)里,到底有多坑?先隨手寫段代碼,你看個(gè)意思:
看起來沒啥毛病對吧?邏輯是對的,也確實(shí)能每處理一個(gè)元素等一秒??赡阋婺眠@個(gè)跑個(gè)大列表,甚至你這一段代碼跑在服務(wù)主線程上,那這個(gè)“等”可就是致命的慢。 **問題是它會(huì)阻塞整個(gè)線程。**你等著的時(shí)候,啥事兒都干不了。線程就像被摁住了腦袋一樣,只能干等。而且這不是異步,不是定時(shí)任務(wù),也不是限流機(jī)制,它就是“睡覺”。 那我應(yīng)該怎么寫?老板說,得看你目的到底是啥。如果你是為了限流,那就用限流工具,比如 Guava 的 比如用
這個(gè)寫法,才是真的“控制頻率”,而不是“強(qiáng)行睡覺”。 那些年我們錯(cuò)用過的 sleep我回想了下,除了循環(huán),還有人寫定時(shí)任務(wù)用 sleep:
這種用法也挺常見的。其實(shí)你如果只是想每10秒執(zhí)行一次任務(wù),為啥不用
這才是正道。而且這玩意線程池可控,還能設(shè)定任務(wù)失敗之后的處理策略,比你那死循環(huán)睡覺靠譜多了。 后來老板讓我回去查了一圈資料,還特意點(diǎn)了我們以前某次接口響應(yīng)慢的問題日志,讓我看看是不是我寫的那段循環(huán)在 sleep,然后線程池爆了…… 真的是血的教訓(xùn)。我自己平時(shí)測試代碼用 有時(shí)候?qū)懘a圖省事,腦子里第一反應(yīng)就是“我等等好了”,于是就加個(gè) 現(xiàn)在我只要看到有同事寫循環(huán) + sleep,我就條件反射說一句:“你是想卡主線程嗎?”大家聽多了也就長記性了。 -END- 閱讀原文:原文鏈接 該文章在 2025/7/23 12:09:06 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |