与Executor服务冻结混淆

时间:2012-02-13 17:52:18

标签: java swing concurrency executorservice

我正在尝试使用Executor服务运行一个摇摆工作者并且发生了一些奇怪的事情。我目前正在使用方法newSingleThreadExecutor();以及执行以下操作;

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

只要我不关闭对话框消息框,我的swing worker代码就会完美运行。如果我关闭对话框,那么我的应用程序就完全冻结了。我相信线程被阻止但不确定是什么原因。

如果我在没有execService的帮助下独自运行swingworker它可以很好地工作,但当然没有超时功能,这就是这个的全部目的。我应该只使用计时器吗?

由于

3 个答案:

答案 0 :(得分: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的处理完成。

答案 1 :(得分:1)

Future.get()是一个阻止通话。它等待任务完成,或直到超时结束。因此,通过在EDT中调用它,您正在使用SwingWorker完成您要避免的操作。

答案 2 :(得分:0)

我不是摇摆专家,但在 Java Concurrency in Practice 中提到swing使用它自己的线程进行UI管理,你不应该干涉它。可能是那个问题。