2012-02-23 27 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 2012-02-23 10:52:16

+1

我想你就错了。正如@aix所说的,如果抛出异常,那么它的当前线程已被中断。在这种情况下不是线程't'。 – Johannes 2012-02-23 10:55:48

+0

所以无论如何,你会建议我做什么?打破程序?继续加入列表中的下一个线程?再次尝试加入列表中的所有线程?再试一次只加入特定的线程t?感谢:-) – nano7 2012-02-23 11:52:04

回答

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 2012-02-23 11:50:29

+0

是的,这将是一个很好的解决方案。 – dacwe 2012-02-23 12:05:36

+1

对不起,为了解决问题:什么是好的解决方案?再次加入所有线程或再次加入SPECIFIC线程,然后与其他人一起继续?谢谢:-) – nano7 2012-02-23 12:13:38