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