2010-03-19 31 views
12

InterruptedException'ın ne yaptığını ve neden atıldığını anlıyorum. Sadece benim uygulama tarafından bilinen bir iş parçacığı üzerinde SwingUtilities.invokeAndWait() beklerken Ancak benim uygulamada Anladım, ve benim uygulama asla da kimseye üzerindeki diş referansını geçer asla herhangi parçacığı üzerinde Thread.interrupt() çağırır.İplerimi kim keser?

Yani benim soru: Kim benim iplik keser?

anlatmak için herhangi bir yolu var mı? InterruptedException, kesmeyi isteyen iş parçacığının adını içermemesinin bir nedeni var mı?

Ben bu yaptığı, aşağıdakileri kullanmak bir çerçeve veya kütüphane olabileceğini okudum, ama onları benim iplik kesmek için için Sebepsiz düşünemiyorum:

  • Hibernate
  • Bahar
  • Log4J
  • MySQL konektörü
+8

demek istediniz "* Kim * CESUR benim iplik kesme?" –

+2

+1 - Konu # birleştirme yapıyor musunuz? InterruptedException atar. – RubyDubee

+0

Nitekim Scott, iş parçacıklarının kesintiye uğramamasını tercih ediyorum (çünkü yine de bu isteğe uymak istemiyorum). İş parçacığını kendimiz yapmayız, ancak invokeAndWait'in böyle bir mekanizma kullandığını hayal edebiliyorum. Ancak, Thead # birleştirmesi başka bir iş parçacığı üzerinde bir kesme mi çağırır? Ayrıca emin değilim ki, iş parçacığımın tamamlanmasını beklemez (asla olmayacağı gibi). – Thirler

cevap

11

Mümkünse, Thread uzantısını genişletebilir ve bu iş parçacığı için bir stacktrace yazdırmak veya desteklenmeyen bir işlem istisnası atmak için interrupt() yönteminin üzerine yazabilirsiniz.

Ayrıca, kesintili konuya bir başvuru kaydetmek ve kesilen istisnayı yakaladıktan sonra okumak için genişletilmiş Thread sınıfını da kullanabilirsiniz.

2

burada tuhaf bir şey var. biz kesintiye eğer doRun.run excecuting bitirmek için ipliği sevk olay için beklerken invokeAndWait ait javadoc itibaren

, bir InterruptedException

atılır()

sen denediniz EDT'de yürütülen kodun herhangi bir istisna göndermiş olup olmadığına bakın. Ya da EDT kodu (bu terim java dilinde "ortodoks" değil biliyorum ama ne demek istediğimi görmek umut bu parçacığının değişkenlerin bazılarını değiştirmeye çalışır yapın: katılmak, herhangi bir kod senkronize ima bekle ... Genelde

+0

'da gerçekleştiğini gösterir. Runnable, bir istisna atarsa, bu durumda bir InvocationTargetException vermelidir. İpliklerimizin beklerken bir kilidi olması mümkündür, bu sebep olabilir mi? Eminim bir çıkmazımız yok. Beklediğimiz iş parçacığı, bekleyen iş parçacığında kullandığımız bir iletişim kutusu oluşturur. – Thirler

4

, bir şey yapıyor kim olduğunu bilmek istiyorsanız, bir hata ayklayc bir kesme noktası koymak ve orada. Eğer yeniden oluşturabiliyorsanız tahmin gerek yok! Bu durumda

yapabilirsiniz gitmek Thread.interrupt()'da bir kesme noktası koyma.Kesintisi kesilmiş başka parçacıklar varsa (böylece kesme noktasında "yanlış pozitif" isabetleriniz varsa), bir breakpoint koşulu ekleyebilirsiniz (çoğu IDE bunu kolayca yapmanızı sağlar), örneğin iplik adını kontrol ediyor.