2012-02-13 75 views
0

我想運行一個使用執行服務的swing工作人員,併發生了一些奇怪的事情。我目前使用方法newSingleThreadExecutor();以及以下操作;與執行者服務混亂凍結

Future<?> f = execService.submit(swingWorker); 
JOptionPane.showMessageDialog(null, "Created Future"); 
f.get(120, TimeUnit.SECONDS); 

發生什麼是我的揮杆工人代碼運行完美,只要我不關閉對話框消息框。如果我關閉對話框,那麼我的應用程序就完全凍結了。我相信線程正在被阻塞,但我不確定是什麼原因。

如果我在沒有execService幫助的情況下自行運行擺動工具,它可以很好地工作,但是超時功能當然不可用,這是完整目的。我應該只使用計時器嗎?

感謝

+0

請提供一點信息,擺動工人的目的是什麼,這可能有助於確定死鎖的原因。 – 01es 2012-02-13 17:57:18

+0

你可以發佈一個簡短的,但*完整的*程序,它演示了這個問題? – 2012-02-13 17:58:02

回答

2

如果它看起來是這樣的:

public void closeDialog(){ 
    SwingUtitilies.invokeLater(new Runnable(){ 
     public void run(){ 
      Future<?> f = execService.submit(swingWorker); 
      JOptionPane.showMessageDialog(null, "Created Future"); 
      f.get(120, TimeUnit.SECONDS); 
     } 
    }); 
} 

您是阻止(中止)的EDT。將阻止f.get(),直到Future的處理完成。

0

我不是要提到的是擺動使用它是UI管理自己的線程擺動專家,但在Java併發實踐,你不得干擾它。可能是這個問題。

1

Future.get()是一個阻塞呼叫。它一直等到任務完成,或者直到超時。因此,通過在EDT中調用它,您正在使用SwingWorker來完成您試圖避免的任務。