2015-02-01 2 views
0

Я новичок в многопоточности (как в целом, так и в Java) и просто пытаюсь поиграть с некоторыми основными аспектами прерванных исключений.Получение InterruptedException для игнорирования прерывания

Когда я запускаю следующий код, я получаю следующий результат -

1: До свидания, мир! 1: Привет, мир! 2: До свидания, мир! 3: До свидания, Мир! 4: До свидания, Мир! 5: До свидания, Мир!

Но я не понимаю, почему поток 1 (поток «Hello, World!») Останавливается, поскольку его предложение Catch пусто (что я думал, что он игнорирует InterruptedException и просто закончит поток).

Я уверен, что у меня что-то не хватает, но я просто не знаю, что это такое.

Спасибо за любую помощь, которую вы можете предложить!


public class GreetingProducer implements Runnable 
{ 
    String greeting; 

    public GreetingProducer (String greetingIn) 
    { 
     greeting = greetingIn; 
    } 
    public void run() 
    { 
     try 
     { 
      for (int i = 1; i <=5; i++) 
      { 
       System.out.println(i + ": " + greeting); 
       Thread.sleep(500); 
      } 
     } 
     catch (InterruptedException e) 
     { 

     } 
    } 

    public static void main(String[] args) 
    { 
     Runnable r1 = new GreetingProducer("Hello, World!"); 
     Runnable r2 = new GreetingProducer("Goodbye, World!"); 
     Thread t1 = new Thread(r1); 
     Thread t2 = new Thread(r2); 
     t1.start(); 
     t2.start(); 
     t1.interrupt(); 
    } 
} 
+0

Как сказал @Jean Logeart, он по-прежнему выходит из нити. Дополнительные сведения см. По адресу http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html. – nyxaria

+0

1: До свидания, Мир! 1: Привет, мир! java.lang.InterruptedException: сон прерывается \t на java.lang.Thread.sleep (Native Method) \t в MultithreadingExamples.GreetingProducer.run (GreetingProducer.java:27) \t на java.lang.Thread.run (Thread .java: 722) 2: До свидания, мир! 3: До свидания, Мир! 4: До свидания, Мир! 5: До свидания, Мир! –

ответ

3

Предложение catch может быть пустым, но InterruptedException быть пойманным и блок поймать казнены.

Никакое действие не выполняется, поскольку исключение проглатывается, но затем код выходит из блока try - catch, как и для любого другого исключения.

Если у вас есть инструкции в блоке catch, он будет выполнен.


Если вы хотите спать без перерыва, вы можете использовать метод sleepUninterruptibly гуавы в:

for (int i = 1 ; i <= 5 ; i++) { 
    System.out.println(i + ": " + greeting); 
    Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS); 
} 

Тогда try - catch блок становится ненужным.

+0

Спасибо, Жан. Я знаю, что это плохая идея игнорировать запросы прерываний, но только для моего собственного назидания, как бы я это сделал? Я., как мне получить метод run(), чтобы в основном сказать «да, я слышал ваш запрос прерывания, но я все равно закончу все». –

+0

Я отредактировал свой ответ. –

+0

Спасибо большое! Я ценю это. –

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

  • Нет связанных вопросов^_^