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

2022-09-04 07:52:35

假设我有以下代码:

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()


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

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


答案 1

通常,在完成其后台工作后需要完成的任何事情都是通过重写其中的方法来完成的。此方法在完成后在 Swing 事件线程上调用,允许您更新 GUI 或打印出某些内容或其他任何内容。如果您确实需要阻止直到它完成,则可以调用 。SwingWorkerdone()get()

铌。在方法中调用将立即返回结果,因此您不必担心会阻止任何UI工作。get()done()


答案 2

调用将导致 SwingWorker 被阻止。get()

来自 Javadocs:

T get() 
      Waits if necessary for the computation to complete, 
      and then retrieves its result.

然后,您的代码将如下所示:

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

推荐