1

我正在尝试将后台服务作为我的 GUI 应用程序的一部分运行。我正在使用一个ExecutorService并且我Future从中得到了回报。这段代码显示了我在做什么:

 play.addActionListener( new ActionListener() {

      service.submit(new Runnable(){ .... } }
 }

现在,提交发生在 GUI 线程上,它应该将异常传播到主线程。现在,我不想阻塞主线程future.get,但我宁愿有一些方法来检查未来的结果,以便将异常传播到主线程。有任何想法吗?

4

3 回答 3

1

您可以使用侦听器模式在后台线程完成时收到通知。例如,SwingWorker 允许 PropertyChangeListeners 监听 SwingWorker.State 状态属性,您可以这样做,也可以自己滚动。这是我最喜欢的 SwingWorker 功能之一。

一个例子....

  final MySwingWorker mySwingWorker = new MySwingWorker(webPageText);
  mySwingWorker.addPropertyChangeListener(new PropertyChangeListener() {

     @Override
     public void propertyChange(PropertyChangeEvent pcEvt) {
        if (pcEvt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
           try {
              mySwingWorker.get();
           } catch (InterruptedException e) {
              e.printStackTrace(); // this needs to be improved
           } catch (ExecutionException e) {
              e.printStackTrace(); // this needs to be improved
           }
        }
     }
  });
  mySwingWorker.execute();
于 2013-05-12T20:09:16.463 回答
0

您可以检查 Future.isDone() 以查看它是否已完成,或者您可以让后台任务执行该操作,例如

play.addActionListener( new ActionListener() {

  service.submit(new Runnable(){ 
     public void run() {
       try {
       // .... 
       } catch(Exception e) {
           SwingUtils.invokeLater(new Runnable() {
               public void run() {
                   handleException(e);
               }
           }
       }
    }
  });
于 2013-05-12T20:02:01.437 回答
0

你可以有一个额外的线程来监控未来的状态:

final Future<?> future = service.submit(...);
new Thread(new Runnable() {
    public void run() {
        try {
            future.get();
        } catch (ExecutionException e) {
            runOnFutureException(e.getCause());
        }
    }
}).start();

在其他地方:

public void runOnFutureException(Exception e) {
    System.out.println("future returned an exception");
}
于 2013-05-12T20:02:27.190 回答