2013-05-12 2 views
1

Я пытаюсь запустить фоновый сервис как часть моего приложения GUI. Я использую ExecutorService, и я получаю от него Future. Этот код показывает, что я делаю:Java - получить ошибки, распространяемые из фонового потока

play.addActionListener(new ActionListener() { 

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

Теперь, представление происходит на GUI потоке, который должен распространяться исключения из основного потока. Теперь я не хочу блокировать основной поток на future.get, но я предпочел бы некоторый способ проверить результат в будущем, чтобы исключения были пропущены в основной поток. Есть идеи?

ответ

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); 
       } 
      } 
     } 
    } 
    }); 
+0

Но 'SwingUtilities.invokeLater()' выполняется на EDT не основной поток. –

+0

@ Eng.Fouad Если это не EDT, о котором говорит OP, я не знаю, почему его нужно вернуть обратно в «основной» поток, который будет выполнен. –

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"); 
} 
+0

Если это нормально, фоновый поток может выполнить вызов. Для этого нет необходимости добавлять еще один поток. –

+1

@PeterLawrey Определенно - это зависит от того, где вы хотите помешать исключению беспорядок - мое предложение оставляет класс фона «чистым». Но оба работают. – assylias

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();