2012-02-13 12 views
0

Executor Serviceを使用してスイングワーカーを実行しようとしていますが、何か不思議なことが起きています。私は現在、方法newSingleThreadExecutor();を使用しているだけでなく、以下を実行しています。Executor Service Freezingとの混乱

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

私のスイングワーカーコードは、ダイアログメッセージボックスを閉じない限り完全に実行されます。ダイアログボックスを閉じると、アプリケーションが完全にフリーズします。私はスレッドがブロックされていると信じていますが、理由は不明です。

execServiceの助けを借りずにスイングワーカーを単独で実行すると、完璧に動作しますが、タイムアウト機能は利用できません。私は代わりにタイマーを使うべきですか?

おかげ

+0

スイングワーカーの目的が何であるかを少し詳しく説明し、デッドロックの原因を特定するのに役立ちます。 – 01es

+0

問題を示す短い*完全な*プログラムを投稿できますか? –

答えて

2

f.get()は未来の処理が完了するまでブロックされます。

0

私はスイングの専門家ではないが、実際でのJava並行処理では、スイングは、それがUI管理のための独自のスレッドだし、あなたがそれを妨げるものではない使用していることを述べています。それが問題かもしれません。

1

Future.get()はブロックコールです。タスクが完了するか、またはタイムアウトが経過するまで待ちます。したがって、EDTで呼び出すことで、SwingWorkerを使用して回避しようとしていることを正確に実行しています。

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:それはのようになります場合は