2012-10-11 4 views
0

Когда мы попробуем Threads.sleep в нашем коде, мы должны поймать InterruptedException. Это означает, что нить не смогла спать в течение времени, которое мы указали, не так ли? Итак, как можно прерывать поток, который мы спали? Может ли кто-нибудь объяснить эту концепцию?Java Thread.sleep

ответ

2

Как можно прервать нить? Я могу называть его Thread.interrupt().

От here:

Прерывание является показанием к потоку, который он должен остановить то, что он делает и делать что-то другое. Программист должен решить точно, как поток отвечает на прерывание, но очень часто бывает для завершения потока. Это использование подчеркивается в этом уроке .

Стоит прочитать this article from JavaSpecialists, чтобы понять, как обращаться с прерываниями чисто.

0

Это может быть прервано сигналом тревоги или другим внешним событием.

+0

О чем вы говорите? Не Java, конечно. –

0

Прерывание прерывания происходит, если поток проснулся раньше заданного времени.

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

Как сказал Брайан Agnew, исключение sleep() является реакция на interrupt(). Концепция здесь заключается в том, что поток должен обеспечивать способы остановить себя; если он не спит, он должен проверять статус прерывания время от времени через interrupted() или isInterrupted() и реагировать соответствующим образом. Но если поток спал, и мы хотим отменить его выполнение, мы будем обречены: нить будет просто спать, не хотелось бы искать флаг interrupted. Но вот что такое встроенное поведение sleep(): если поток прерывается до завершения сна, мы получаем InterruptedException.

Смежные вопросы