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

Dam*_*doh 2 java swing multithreading swingworker

我从教程中复制了以下代码并将其粘贴到我的编辑器 (Netbeans 8.1) 中。我阅读了SwingWorker 文档,从我从这个文档和其他文档中了解到,execute()方法应该“启动线程”(或将其放入工作线程)。

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

pet*_*ulb 5

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

公共最终无效执行()

调度此 SwingWorker 以在工作线程上执行。有许多可用的工作线程。

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

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