1

我有一个带有 IOBound 任务的 SwingWorker 线程,它在运行时完全锁定了接口。将正常工作负载换成计数器循环具有相同的结果。SwingWorker 看起来基本上是这样的:

public class BackupWorker extends SwingWorker<String, String> {

private static String uname = null;
private static String pass = null;
private static String filename = null;
static String status = null;

BackupWorker (String uname, String pass, String filename) {
    this.uname = uname;
    this.pass = pass;
    this.filename = filename;
}

@Override
protected String doInBackground() throws Exception {
            BackupObject bak = newBackupObject(uname,pass,filename);
    return "Done!";
}

}

启动它的代码位于扩展 JFrame 的类中:

    public void actionPerformed(ActionEvent event) {
    String cmd = event.getActionCommand();

    if (BACKUP.equals(cmd)) { 
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {

                final StatusFrame statusFrame = new StatusFrame();
                statusFrame.setVisible(true);

                SwingUtilities.invokeLater(new Runnable() {
                    public void run () {
                        statusFrame.beginBackup(uname,pass,filename);
                    }
                });
            }
        });
    }
}

这是 StatusFrame 有趣的部分:

public void beginBackup(final String uname, final String pass, final String filename) {
    worker = new BackupWorker(uname, pass, filename);
    worker.execute();

    try {
        System.out.println(worker.get());
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

}

就我所见,所有“长时间运行”的东西都由工人处理,所有接触到 EDT 上的 GUI 的东西。我是否在某个地方纠结过,还是我对 SwingWorker 期望过高?

4

2 回答 2

6

我认为问题是由于SwingWorker.get()在您的beginBackup方法中调用。查看此方法的文档

如有必要,等待计算完成,然后检索其结果。

这是一个阻塞调用,因此您的 GUI 变得无响应。

(另外,有什么特别的原因让你在通话中做一个invokeLaterfrominvokeLater吗?你已经在 EDT 上运行了。)

于 2010-06-06T07:09:16.153 回答
0

阅读 Swing 教程中关于具有临时结果的任务的部分以获取工作示例。您将看到 get(...) 方法是从在 SwingWorker 类中覆盖的 process(...) 方法中调用的。

于 2010-06-06T14:42:29.173 回答