2012-11-29 31 views
1

很長一段時間我一直在使用以下功能進行了一段時間當前線程睡眠:這種睡眠實施有什麼問題嗎?

class Utils { 

static public sleep(int ms) { 
    try { 
    Thread.sleep(ms); 
    } catch(InterruptedException x) {} 
} 

} 

但因爲我siliently不理我懷疑異常,如果有可能的情況下這個功能將成爲邪惡?

+0

中斷時,線程將提前喚醒,您將忽略它。 –

+0

當你沒有消息日誌時,處理異常的意義是什麼? – PermGenError

+0

你是否在意睡眠過早中斷?如果沒有,請在catch塊(在{}之間)發表評論來解釋它。如果你照顧,然後處理它。如果您進行大量循環並且睡眠會減慢處理速度,並且出於某種原因睡眠不起作用(例如不斷中斷),那麼這可能會變得很糟糕。可能不太可能的情況。 – xagyg

回答

7

如果你沒有在自己的代碼使用中斷,你應該保持中斷狀態:

catch(InterruptedException x) { 
    Thread.currentThread.interrupt(); 
} 

,或者您可以通過拋出InterruptedException對付它上漲。這立即讓呼叫者知道有一箇中斷,否則可以稍後用isInterrupted()進行檢查。

如果您必須全天睡眠,那麼您可以在中斷後繼續睡眠,然後重新中斷線程。請參閱番石榴的Uninterruptibles.sleepUninterruptibly以實現此目的。

通過不清除線程的中斷狀態,可以防止代碼干擾可能使用中斷的其他任何事情。因此,如果將來您想要中斷某個線程,那麼在有時可以工作的情況下,您不會有晦澀的錯誤,有時甚至不會。

如果你永遠不會使用中斷,可能會完全忽略它,但爲了以防萬一,保持靈活性是很好的。

+0

有趣的是,這有什麼好處?我們也忽略了這個異常。 – AlexWien

+0

@AlexWien抓取和重新打入與原始碼相同,但是不刪除中斷 - 線程保持中斷狀態並且可以稍後處理。我已經添加了更多關於其他可能性的信息,但要選擇什麼取決於上下文。 – fgb