当前位置: 首页 > 面试题库 >

如何等待SwingWorker的doInBackground()方法?

岳炎彬
2023-03-14
问题内容

说我有以下代码:

import java.lang.InterruptedException;
import javax.swing.SwingWorker;

public class Test
{
    private JDialog window;

    public Test
    {
        // instantiate window
    }

    private class Task extends SwingWorker<Void, Void>
    {
        public Void doInBackground()
        {
            try { Thread.currentThread().sleep(5000); }
            catch(InterruptedException e) {}
            return null;
        }
    }

    public void doTask()
    {
        Task task = new Task();
        task.execute();
    }

    protected void process()
    {
        // update various GUI components here
    }

    public static void main(String args[])
    {
        Test t = new Test();
        t.doTask();
        System.out.println("done");
    }
}

我需要等到t.doTask()完成后再打印“完成”,但是我不确定具体如何。我知道我可能应该join()在这里使用,但是我需要一个线程来调用它,而且我不知道如何doInBackground()从需要调用的地方获取它的线程join()。谢谢你的帮助。

编辑:感谢您的答复。不幸的是,get()类似方法并不能完全解决问题。在我的实际代码中,SwingWorker还具有重写process()功能,可在后台线程运行时更新GUI窗口。
get()的确不会停止“完成”的打印,直到之后doInBackground,但是GUI不会更新。我更新了示例代码以反映这一点,尽管现在当然不会编译。

有没有办法让“完成”仅doInBackground完成一次打印?GUI更新代码和“ done”语句是否在同一线程上?我需要创建新线程吗?


问题答案:

通常,在SwingWorker完成其后台工作之后需要执行的所有操作都是通过覆盖其中的done()方法来完成的。完成后在Swing事件线程上调用此方法,使您可以更新GUI或打印出内容或进行任何操作。如果您确实确实需要屏蔽直到完成,则可以致电get()

注意 get()在该done()方法内调用将立即返回您的结果,因此您不必担心会阻塞任何UI工作。



 类似资料:
  • 请考虑以下代码片段: 下面是向小程序添加一个标签,该标签显示工作线程的一些中间结果(使用发布/处理方法)。最后,标签将从小程序的窗格中移除。我的问题是,我如何创建几个标签,每个标签都有自己的工作线程,并在全部完成后删除它们? 提前感谢。 更新: 我希望这能澄清我的问题。我希望在所有工人完成任务后,而不是在每个工人完成任务后立即移除所有标签。 更新2: 下面的代码似乎正在做我需要的事情。请评论我的做

  • 我正在编写一个WinForms应用程序,它将数据传输到USB HID类设备。我的应用程序使用了优秀的通用HID库V6.0,可以在这里找到。简单来说,当我需要向设备写入数据时,这是被调用的代码: 当我的代码退出while循环时,我需要从设备中读取一些数据。但是,设备无法立即响应,因此我需要等待此呼叫返回后再继续。由于当前存在,RequestToGetInputReport()声明如下: GetInp

  • 我遵循的教程"Web应用程序开发与Yii2和PHP",其中代码欺骗用于测试目的(TDD)。 当使用JavaScript验证运行测试时,书中描述的测试使用方法,该方法允许测试等待1秒钟以允许验证。 这项功能似乎不再受支持。它存在于文档中,但在深入研究代码时,找不到该方法。 我做错了什么,还是错过了配置更改?

  • 问题内容: 是否有与Java SwingWorker类等效的JavaFX? 我知道JavaFX Task,但是有了它,您只能发布String消息或进度。我只想在GUI线程中调用方法,就像使用SwingWorker一样(通过发布任意类型的消息)。 这是我的意思的一个例子: 解 非常感谢您的回答。我正在寻找的解决方案是使用Platform.runLater(Runnable guiUpdater) 。

  • 问题内容: 我正在尝试编写一个JS代码,如果给定的数字已经存在于数据库中,它将取消“ btn_submit”按钮.onclick事件。我使用AJAX向数据库查询给定的编号,并确定是否应将数据发送到将上传问题的.php站点。为了确定这一点,我需要numOfRows变量的值,但是因为我在AJAX中将其设置为0,所以validation()函数将在我的AJAX查询完成之前完成,这将导致始终表示给定数字不

  • 问题内容: 我的问题: 如何在a上执行一堆线程对象并等待它们全部完成后再继续? 我是ThreadPoolExecutor的新手。因此,此代码是测试以了解其工作方式。现在我什至都不用对象填充,因为我不理解如何在不调用另一个队列的情况下开始队列。无论如何,现在我只是打电话给我,但我认为我仍然缺少一些东西。任何提示都很棒!谢谢。 RunnableObject类: 问题答案: 你应该循环