Java - 从后台线程传播错误

时间:2013-05-12 19:58:02

标签: java user-interface executorservice

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

 play.addActionListener( new ActionListener() {

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

现在,提交正在GUI线程上进行,该线程应该将异常传播到主线程。现在,我不想阻止future.get上的主线程,但我宁愿通过某种方式检查未来的结果,以便将异常传播到主线程。有什么想法吗?

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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);
               }
           }
       }
    }
  });

答案 2 :(得分: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");
}