我正在尝试将后台服务作为GUI应用程序的一部分运行。我正在使用ExecutorService
,我正在从中获得Future
。这段代码显示了我在做什么:
play.addActionListener( new ActionListener() {
service.submit(new Runnable(){ .... } }
}
现在,提交正在GUI线程上进行,该线程应该将异常传播到主线程。现在,我不想阻止future.get
上的主线程,但我宁愿通过某种方式检查未来的结果,以便将异常传播到主线程。有什么想法吗?
答案 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");
}