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

时间:2018-01-22 10:56:58

标签: java multithreading swing swingworker

我从教程中复制了以下代码并将其粘贴到我的编辑器(Netbeans 8.1)中。我读了SwingWorker documentation,根据我对此和其他文档的理解, 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();
    }
}

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

1 个答案:

答案 0 :(得分:4)

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

  

public final void execute()

     

安排此SwingWorker在工作线程上执行。有许多工作线程可供使用。

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

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