我正在尝试使用Executor服务运行一个摇摆工作者并且发生了一些奇怪的事情。我目前正在使用方法newSingleThreadExecutor();
以及执行以下操作;
Future<?> f = execService.submit(swingWorker);
JOptionPane.showMessageDialog(null, "Created Future");
f.get(120, TimeUnit.SECONDS);
只要我不关闭对话框消息框,我的swing worker代码就会完美运行。如果我关闭对话框,那么我的应用程序就完全冻结了。我相信线程被阻止但不确定是什么原因。
如果我在没有execService的帮助下独自运行swingworker它可以很好地工作,但当然没有超时功能,这就是这个的全部目的。我应该只使用计时器吗?
由于
答案 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管理,你不应该干涉它。可能是那个问题。