5

我们的 Swing 应用程序使用出色的 SwingWorker 类在后台线程中执行一些长时间运行的任务。但是,很多旧的 Mac 只支持 Java 5,所以我们希望将我们的应用程序编译为 5 而不是 6。因为 SwingWorker 是在 Java 6 中引入的,我们不能再使用它。

如果我只需要在后台做某事,然后在完成后在 GUI 中进行通信,那么以下内容是否可以接受?还是我忘记了一些重要的事情?

public static void wannabeSwingWorker(final Runnable doInBackground, final Runnable callback) {
    Thread backgroundThread = new Thread(new Runnable() {
        public void run() {
            doInBackground.run();
            SwingUtilities.invokeLater(callback);
        }
    });
    backgroundThread.start();
}
4

4 回答 4

10

我会让其他人评论您的代码的适用性,但作为替代方案,您可以在此处下载用于 Java 5 的 Swingworker 的反向移植。

于 2010-11-02T10:11:47.060 回答
3

您的代码应该可以正常工作;当然,您将失去 SwingWorker 的所有其他功能(返回部分结果和进度、可取消、支持侦听器),

于 2010-11-02T10:14:02.173 回答
2

看看Foxtrot,它的工作方式与大多数 Swing 并发库不同。

它不是触发后台线程来执行长时间运行的任务,而是通过在 Swing EDT 上执行长时间运行的任务并触发新线程来处理 GUI 事件来模拟 Swing 在显示模式对话框时所采用的方法。

当处理一个长时间运行的任务时,它会返回一个您需要立即采取行动的值,这会产生一段非常漂亮的、程序化/非并发的程序代码(就像检查来自 的返回值一样JOptionPane.showConfirmDialog(...))。

于 2010-11-02T19:48:30.213 回答
1

如果您的产品中的 LGPL 代码没有任何问题,您可以使用 SwingWorker 到 Java 5 的反向移植版本。

http://java.net/projects/swingworker

于 2010-11-02T10:19:50.123 回答