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

标签 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) (据我所知,应该暂停事情),它按预期工作。

最佳答案

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方法,尽管这会阻塞你的主线程。

关于java - SwingWorker的execute()方法似乎没有做任何事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48379969/

相关文章:

java列表通过重新排列链接来移动项目

java - 如何用java发送0x99?

java - 将事件分派(dispatch)线程置于搁置状态,直到 Swing 计时器停止

Java Swing 按键事件库

java - Java 中的 GridLayout 帮助

java - 我应该在 HTTPClass 中的哪里实现这个 Jackson Root Element 代码?

java - Spring Data 存储库是如何实际实现的?

c++ - 无锁多线程比单线程程序慢吗?

ASP.NET 线程切换

java - 无法加载已保存的 JButton