2012-10-11 70 views
0

當過我們在代碼嘗試Threads.sleep,我們必須抓住一個InterruptedException。這意味着該線程在我們指定的時間內無法睡眠,對吧?那麼我們怎麼能讓一個睡覺的線程中斷呢?任何人都能解釋這個概念嗎的Java的Thread.sleep

回答

2

如何線程被中斷?我可以打電話給Thread.interrupt()

here

中斷是指示一個線程,它應該停止它 正在做和做別的事情。由程序員決定 究竟是一個線程如何響應中斷,但是線程終止的非常常見的是 。這是 課程中強調的用法。

這是值得閱讀this article from JavaSpecialists瞭解如何處理中斷乾淨。

0

它可能通過報警或其他外部事件而中斷。

+0

你在說什麼?當然不是Java。 –

0

的InterruptionException occures,如果線程醒來早於給定的時間。

的Execption只是拋出給你(線程)的選項來處理的特殊情況。

在你不需要趕上這execption最常見的情況。我喜歡小幫手是:

public class Sleeper { 

    private static final Logger log = Logger.getLogger(Sleeper.class); 

    /** 
    * @param time 
    * @param units 
    * @return milliseconds 
    */ 
    public static long sleepUnsafe(final long time, final TimeUnit units) { 
     final long start = System.currentTimeMillis(); 
     final long millis = TimeUnit.MILLISECONDS.convert(time, units); 
     try { 
      Thread.sleep(millis); 
     } catch (final InterruptedException e) { 
      final long end = System.currentTimeMillis(); 
      final long timeSlept = end - start; 
      final long difference = millis - timeSlept; 
      if (difference > 0) { 
       Sleeper.log.warn("should sleep for " + time + " " + units + ". But was awaked after " + (end - start) + " ms. Diffence is " + difference 
         + "ms."); 
       return difference; 
      } 
     } 
     return 0; 
    } 

    /** 
    * 
    * @param millis 
    * @return 
    */ 
    public static long sleepUnsafe(final long millis) { 
     return Sleeper.sleepUnsafe(millis, TimeUnit.MILLISECONDS); 
    } 
} 
0

正如布萊恩·阿格紐說,在sleep()例外是反應interrupt()。這裏的概念是一個線程應該提供方法來阻止自己;如果它不睡覺,它應該通過interrupted()isInterrupted()不時檢查中斷狀態,並作出相應的反應。但是如果線程正在休眠,並且我們想取消它的執行,那麼我們就會註定要失敗:線程只是在睡覺,它不會在意尋找interrupted標誌。但這就是sleep()的內置行爲:如果線程在睡眠完成之前中斷,我們將得到一個InterruptedException。