我正在编写一个应用程序,它使用SwingWorker执行其文件菜单操作。每个被调用的方法都返回一个boolean值,该值指示操作是否成功执行。
目前,我正忙着等待结果,如下所示:
public boolean executeOperation() {
final SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
// ..
if (aborted) {
return false;
}
// ..
return true;
}
};
worker.execute();
// busy wait
while (!worker.isDone())
;
try {
return worker.get().booleanValue();
} catch (Exception e) {
// handle exceptions ..
return false;
}
}是否有一种较少的民意测验强度的方法来解决这个问题?
直接使用worker.get()将无法工作,因为它会阻塞EDT,等待任务完成--这意味着即使我在SwingWorker中打开的对话框也不会被绘制。
编辑:如果可能的话,我希望避免方法(或工作人员)异步地通信他们的结果。我正在实现几个相互依赖的短方法(文件->打开、新的、关闭的、保存的、另存的、退出的)(即当试图退出时,退出调用关闭,关闭可能调用保存,保存可能调用保存为)。异步解决这个问题似乎会使代码变得更加复杂。
发布于 2011-09-08 09:08:16
SwingWorker的目的正是要在后台启动一些任务,而不是阻止EDT。无论您想要什么同步的东西,无论您尝试什么,EDT都会被阻塞,或者您想要异步的东西,后台任务应该使用SwingWorker的SwingWorker方法来更新它的状态。
在任务运行时,您可以使用进度条显示阻塞模式对话框,并在任务完成后隐藏它。
另一种方法是阻塞一段时间,希望任务能够快速完成,然后备份到异步方式。这可以使用get method taking a timeout作为参数来完成。
发布于 2011-09-08 09:00:05
您可以使用异步范例。查看观察者/观察者,并使用该作业将结果传递回当前正在执行轮询的对象。
发布于 2011-09-08 09:35:36
直接使用
worker.get()将无法工作,因为它会阻塞EDT,等待任务完成--这意味着即使我在SwingWorker中打开的对话框也不会被绘制。
它们也不符合当前代码。您的繁忙等待会像调用worker.get()一样阻塞EDT --只有一个事件分派线程,如果该线程在循环中旋转或等待锁,则SwingWorker中的对话框同样会被阻塞。这里的问题是,如果一个方法在EDT上运行,它就不能将异步操作的值(不占用EDT)返回给它的调用方。
对已完成的异步处理作出反应的正确方法是在done()中重写SwingWorker方法。
还可以查看http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html获得更多信息。
https://stackoverflow.com/questions/7345521
复制相似问题