2014-01-06 3 views
1

Я использовал Thread.sleep для всех видов разным причинам, но одна вещь, которую я никогда не понимал, когда исключение произойдет во время этой попытки/поймать блока:Когда будет достигнута эта блокировка?

try { 
    Thread.sleep(1000); // sleep for 1 second. 
} catch (Exception x) { 
    fail("Failed due to an exception during Thread.sleep!"); 
    x.printStackTrace(); 
} 

Что бы произойти в компьютере на самом деле ударить исключение на Thread.sleep? Мое лучшее предположение, возможно, в том, что, возможно, системные часы имеют один раз в жизни «пропустить бит», как пульс, но как часто это происходит.

Итак, в сущности, мой вопрос: при выполнении Thread.sleep , что должно произойти внутри для #sleep, чтобы выбросить исключение?

+0

Единственное проверенное исключение, о котором я знаю, это 'InterruptedException'. (Обратите внимание, что если код обнаруживает что-то более конкретное, чем «Исключение», вы, вероятно, не будете царапать свою голову здесь. Вы никогда не должны «ловить (исключение)» по ряду причин, включая это.) – cHao

ответ

8

Если вы смотрите в JavaDoc для Thread.sleep() вы видите именно то, что может произойти:

Броски:
IllegalArgumentException - если значение Millis отрицательно
InterruptedException - если поток прервал текущий поток. Прерванный статус текущего потока очищается при вызове этого исключения.

пример того, как прервать другой поток может выглядеть следующим образом:

public class Foo { 
    public static void main(final String[] args) throws Exception { 
     Thread sleepThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(10000); 
       } catch (InterruptedException e) { 
        System.out.println("Interrupted!"); 
       } 
      } 
     }); 
     sleepThread.start(); 
     Thread.sleep(500); 
     sleepThread.interrupt(); 
    } 
} 

Это напечатает

Прерванный!

+0

so - what .. используя что-то вроде 'wait()' метода? – sircapsalot

+1

Добавлен пример прерывания другого потока. – Keppil

+0

Отлично! Спасибо за это. Примут через 3 минуты;) этот код здесь дал мне практический (но непрактичный) пример того, как его использовать, и когда он ударит по этому исключению. – sircapsalot

3

Класс Thread определяет interrupt method. Когда он вызывается (очевидно, из другого потока) потоком и нет исключения безопасности, выбрасывается InterruptedException.

Цель - точно (и обычно) прервать сон.

0

Когда выдается прерывание потока, например, если сигнал был отправлен, чтобы закрыть JVM.

+0

Обычной причиной прерывания потока будет другой поток, вызывающий ['interrupt()') (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupt()) на нем. – ajb

+0

Согласованный, возможно, плохой пример (хотя настоящий). Я на самом деле проголосовал за ответ Кеппиля: D – MarkL

1

Thread.sleep (someValue) может запускать InterruptedException.
Подробнее об обработке этого исключения и резона для этого вы можете найти here.

Вы можете найти много полезных ответов на SO. Вот один, например: When does Java's Thread.sleep throw InterruptedException?

+0

wow - спасибо за этот теоретический пост .. это очень помогло! – sircapsalot

0

Нить может бросить InterruptedException (который вы должны использовать вместо общего Exception), когда поток прерывается (обычно методом прерывания() вызывается из другого Thread), а не просто ожидание. Это не имеет никакого отношения к методу sleep().

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