2012-02-23 2 views
4

Что рекомендуется делать, если соединение потоков не работает?Java: если присоединение Темы не работают: перерыв или продолжение?

 for (List t : threads) { 
      try { 
       t.join(); 
      } catch (InterruptedException e) { 
       log.error("Thread " + t.getId() + " interrupted: " + e); 
       // and now? 
      } 
     } 

это рекомендуется разбивать то (что происходит потом с другими нитями, которые еще? Не присоединились) или вы должны по крайней мере попытаться присоединиться к остальной резьбе, а затем идти дальше?

Спасибо за советы!

==>Заключение: Вы должны попробовать еще раз присоединиться к определенной теме t или вы должны прервать этот конкретный поток t и продолжить.

 for (List t : threads) { 
     try { 
      t.join(); 
     } catch (InterruptedException e) {  
      try { 
       // try once! again: 
       t.join(); 
      } catch (InterruptedException ex) { 
       // once again exception caught, so: 
       t.interrupt(); 
      } 
     } 
     } 

Так что вы думаете об этом решении? и правильно ли это делать «t.interrupt()» или должно быть Thread.currentThread(). interrupt(); ?

спасибо! :-)

+0

Зависит от того, что вы хотите сделать ... – m0skit0

+1

Я думаю, что вы ошибаетесь. Поскольку @aix говорит, если это исключение выбрано, то это текущий поток, который был прерван. Не поток 't' в этом контексте. – Johannes

+0

Так или иначе, что бы вы посоветовали мне сделать? нарушить процедуру? просто продолжайте соединять следующий поток в списке? попробуйте еще раз, чтобы присоединиться ко всем потокам в списке? попробуйте еще раз, чтобы присоединиться к конкретной теме t? Спасибо :-) – nano7

ответ

2

Вы получаете InterruptedException, потому что какая-то другая нить прервала это, соединение, нить, а не потому, что join не «работал». Цитируется по API documentation:

InterruptedException - если другой поток прервал текущий поток. Прерванный статус текущего потока очищается при вызове этого исключения.


Я бы посоветовал вам присоединиться нить снова, например:

for (List t : threads) { 
    while (true) { 
     try { 
      t.join(); 
      break; 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
      // ... and ignore the interrupt 
     } 
    } 
} 
+0

, так что, по-вашему, мне нужно снова просмотреть список тем и присоединиться к ним? разве не хватило бы просто повторить попытку присоединиться к конкретной теме t, а затем продолжить работу с другими? в любом случае, вы бы не нарушили соединение, правда? – nano7

+0

Да, это было бы хорошим решением. – dacwe

+1

Извините, для reasking: что именно было бы хорошим решением? снова присоедините все нити или просто присоединитесь к СПЕЦИФИЧЕСКОЙ теме снова и продолжайте дальше с другими? спасибо :-) – nano7

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