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 方法完成,尽管这会阻塞您的主线程。
我从教程中复制了下面的代码并将其粘贴到我的编辑器 (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 方法完成,尽管这会阻塞您的主线程。