【问题标题】:SwingWorker's execute() method doesn't seem to do anythingSwingWorker 的 execute() 方法似乎没有做任何事情
【发布时间】:2018-01-22 10:56:57
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading swing swingworker


    【解决方案1】:

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

    public final void execute()

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

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

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

    【讨论】:

    • 我尝试在 w.execute() 语句之后放置一个 Thread.sleep(long-time) 并显示结果。我想我明白了问题所在。谢谢。
    • 另外说明,为什么 SwingUtilities.invokeLater(worker obj) 有效?运行 main 方法的线程是否等待这个?
    • @DameLyngdoh 是的,当在那里休眠时,您会给另一个线程足够的时间来执行。 w.get() 方法以更有效的方式做到这一点:)
    • 不,invokeLater() 将一个事件放入 AWT 队列和 VM won't automatically shut down while there are still events being processed
    • @biziclop 是的,也刚刚检查过。我没有意识到这是 10 秒的等待,这并不表示守护线程
    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2019-11-26
    • 2019-12-08
    • 2023-03-03
    • 2020-12-21
    • 2023-04-06
    相关资源
    最近更新 更多