2012-02-13 59 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来完成您试图避免的任务。