等待具有多线程的AWT事件调度程序线程线程

时间:2011-02-17 08:23:56

标签: java user-interface swing awt

有没有办法阻止EDT上的执行,还有一个生动的gui?

我注意到JDialog / JOptionPane在调用setVisible(true)时有类似的东西。

为什么我需要这个?

我的班级应满足以下界面:

interface Quitable {
   boolean quit();
}

My Class需要这样的实现:

class MyApp implements Quitable {
    ExecutorService executor = Executors.newCachedThreadPool();
   // ...
   public boolean quit() {
           FuturTask<Boolean> futureTask = new FutureTask<Boolean>(saveJob);
           executor.execute(futureTask);
           // TODO: keep gui vivid
           boolean saveResult = futureTask.get();
           return saveResult;
   }
   // ...
}

我需要返回保存过程的结果(这可能需要一些时间并且可能会失败)。或者你会建议另一种解决方案?谢谢你的任何想法。 ;)

2 个答案:

答案 0 :(得分:1)

JDialog不会阻止EDT的执行,当它以模态打开时,EDT会忽略除jDialog事件之外的事件。

我建议您在调用quit方法之前将progressbar显示为模态。

答案 1 :(得分:1)

Dialog导致事件循环在阻塞时执行。有一个过滤器允许某些事件通过,例如重绘请求,调用事件和事件到对话框窗口。此API不会公开。

有一个库(Foxtrot,IIRC),它使用Dialog上的黑客来揭露这种行为。

我强烈建议以不需要这样的方式构建程序。这是一个非常程序化而非事件驱动的组织。因此,将您的任务排入另一个线程(可能是线程池/执行器服务或类似GUI的事件循环),然后使用java.awt.EventQueue.invokeLater更新GUI。