首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何阅读一个摇摆人的结果*没有*忙碌的等待?

我如何阅读一个摇摆人的结果*没有*忙碌的等待?
EN

Stack Overflow用户
提问于 2011-09-08 08:55:06
回答 5查看 5.9K关注 0票数 6

我正在编写一个应用程序,它使用SwingWorker执行其文件菜单操作。每个被调用的方法都返回一个boolean值,该值指示操作是否成功执行。

目前,我正忙着等待结果,如下所示:

代码语言:javascript
复制
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中打开的对话框也不会被绘制。

编辑:如果可能的话,我希望避免方法(或工作人员)异步地通信他们的结果。我正在实现几个相互依赖的短方法(文件->打开、新的、关闭的、保存的、另存的、退出的)(即当试图退出时,退出调用关闭,关闭可能调用保存,保存可能调用保存为)。异步解决这个问题似乎会使代码变得更加复杂。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-08 09:08:16

SwingWorker的目的正是要在后台启动一些任务,而不是阻止EDT。无论您想要什么同步的东西,无论您尝试什么,EDT都会被阻塞,或者您想要异步的东西,后台任务应该使用SwingWorker的SwingWorker方法来更新它的状态。

在任务运行时,您可以使用进度条显示阻塞模式对话框,并在任务完成后隐藏它。

另一种方法是阻塞一段时间,希望任务能够快速完成,然后备份到异步方式。这可以使用get method taking a timeout作为参数来完成。

票数 6
EN

Stack Overflow用户

发布于 2011-09-08 09:00:05

您可以使用异步范例。查看观察者/观察者,并使用该作业将结果传递回当前正在执行轮询的对象。

票数 4
EN

Stack Overflow用户

发布于 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获得更多信息。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7345521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档