Java 5 SwingWorker的更换

Java 5 SwingWorker的更换,java,swing,swingworker,Java,Swing,Swingworker,我们的Swing应用程序使用优秀的SwingWorker类在后台线程中执行一些长时间运行的任务。然而,许多旧的Mac只支持Java5,所以我们希望将应用程序编译为5而不是6。因为SwingWorker是在Java6中引入的,所以我们不能再使用它了 如果我只需要在后台做一些事情,然后在完成后在GUI中进行通信,那么以下内容是否可以接受?还是我忘记了一些重要的事情 public static void wannabeSwingWorker(final Runnable doInBackground,

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

如果我只需要在后台做一些事情,然后在完成后在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();
}

我会让其他人对您的代码的适用性发表意见,但作为替代方案,您可以下载Swingworker的后端口以在Java 5中使用。

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

如果您的产品中的LGPL代码没有任何问题,您可以使用SwingWorker到Java 5的后端口版本

看一看,它的工作原理与大多数Swing并发lib不同

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


当处理一个长时间运行的任务,该任务返回一个您需要立即执行的值时,这会产生一段非常漂亮的程序代码(与从
JOptionPane.showConfirmDialog(…)
)检查返回值完全相同)。

实际上,看起来这是SwingWorker的原始实现,Sun将其移植到了标准库中。