2010-03-19 24 views
12

我明白InterruptedException的作用和拋出的原因。然而,在我的應用程序得到它是隻有我的應用程序稱爲一個線程等待SwingUtilities.invokeAndWait()時,我的應用從來沒有在任何線程調用Thread.interrupt(),也一直不能成功的線程上的任何人蔘考。誰中斷我的線程?

所以我的問題是:誰打斷了我的線程?

有沒有辦法告訴? InterruptedException不包含請求中斷的線程的名稱是否有原因?

我看,這可能是一個框架或庫,做到這一點,我們使用以下,但我想不出理由爲他們打斷我的線程:

  • 休眠
  • Log4J的
  • MySQL連接
+8

我想你是指「誰* DARES *中斷我的線程?」 – 2010-03-19 09:04:30

+2

+1 - 你在線程#加入嗎?它會拋出InterruptedException。 – RubyDubee 2010-03-19 09:04:40

+0

確實是斯科特,我寧願我的線程不會中斷(因爲我不想遵從請求)。 我們不會自己加入Thread#,但我可以想象invokeAndWait使用這種機制。但是,Thead#會在另一個線程上調用中斷嗎?此外,我很確定沒有人等待我的線程完成(因爲它永遠不會)。 – Thirler 2010-03-19 09:16:34

回答

11

如果可能的話,你可以擴展Thread並覆蓋interrupt()方法該線程打印一個堆棧跟蹤或拋出一個不支持的操作異常。

你也可以使用擴展Thread類,以存儲中斷線程的引用,並讀它,一旦你捕捉中斷例外。

2

這裏有一些奇怪的事情。

invokeAndWait的Javadoc,一個InterruptedException拋出

如果我們等待時發生中斷事件指派線程完成執行doRun.run()

您是否嘗試過查看EDT中執行的代碼是否發送任何異常?或者在那個EDT中的代碼試圖修改這個線程的一些變量(我知道這個術語在java語言中不是「正統的」,但我希望你明白我的意思:暗示同步,等待,加入......的任何代碼

+0

如果我們正在等待的Runnable拋出異常,它應該給出一個InvocationTargetException,而不是這種情況。我們的線程有可能在等待時鎖定,可能導致它?我相信我們沒有僵局。我們等待的線程創建一個我們在等待線程中使用的對話框。 – Thirler 2010-03-19 09:20:21

4

一般來說,如果你想知道誰在做什麼,附加一個調試器,把一個斷點,你去那裏。無需猜測,如果你能重現!

在這種情況下,你可以在Thread.interrupt()處設置一個斷點如果還有其他線程也被中斷(所以你在斷點上有「誤判」命中),你可以添加一個斷點條件(大多數IDE允許你輕鬆完成),例如檢查線程的名稱。