如何在没有*忙等待的情况下读取SwingWorker的结果*?

riw*_*iwi 6 java swing swingworker

我正在编写一个使用执行文件菜单操作的应用程序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;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有一种较少投票的方式来解决这个问题?

worker.get()直接使用不起作用,因为它阻止了EDT,等待任务完成 - 这意味着即使我在内部打开的对话框SwingWorker也不会被绘制.

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

JB *_*zet 6

SwingWorker的目的正是在后台启动一些任务,而不是阻止EDT.要么你想要同步的东西,要么你想要阻止EDT,或者想要异步的东西,后台任务应该使用publishSwingWorker 的方法更新它的状态.

您可以在任务运行时显示带有进度条的阻止模式对话框,并在任务完成后隐藏它.

另一种方法是阻塞一段时间,希望任务快速完成,然后备份到异步方式.这可以使用get以超时为参数的方法来完成.

  • 我认为这解决了我的问题:目前我的所有方法都使用`SwingWorker`s - 这似乎是一个问题,因为我必须等待结果.我将从这些方法中删除`SwingWorker`并仅调用它一次,但同步执行`SwingWorker`中的所有内容. (2认同)