SwingWorker 的 execute() 方法似乎没有做任何事情

SwingWorker's execute() method doesn't seem to do anything

我从教程中复制了下面的代码并将其粘贴到我的编辑器 (Netbeans 8.1) 中。我阅读了 SwingWorker documentation,据我从这篇文档和其他文档中了解到,execute() 方法假设为 "start the thread"(或将其放入 worker线程)。

public class Sandbox {
    public static void main(String[] args)
    {
        SwingWorker<Void, Void> w = new SwingWorker<Void, Void>() {
            @Override
            protected Void doInBackground() throws Exception { 
                for(int i=0; i<=10; i++){
                    Thread.sleep(1000);
                    System.out.println(i);
                }
                return null;
            }
        };
        w.execute();
    }
}

这里有什么问题?如果我使用 SwingUtilities.invokeLater(w) 它有效,但它只显示 0,当我删除 Thread.sleep(1000)(据我所知,这应该是暂停),它按预期工作。

SwingWorker 确实使用守护线程(这里以工作线程的形式)。当唯一的线程 运行 都是守护线程时,Java 虚拟机本身退出。因此,在您的程序中,您到达了 main 方法的末尾并且您的程序被终止。见 API:

public final void execute()

Schedules this SwingWorker for execution on a worker thread. There are a number of worker threads available.

删除 Thread.sleep 时,您的计算机速度可能足以在 JVM 退出之前执行循环。

您可以等待 SwingWorker 使用 get 方法完成,尽管这会阻塞您的主线程。