Java 5 SwingWorker的更换
我们的Swing应用程序使用优秀的SwingWorker类在后台线程中执行一些长时间运行的任务。然而,许多旧的Mac只支持Java5,所以我们希望将应用程序编译为5而不是6。因为SwingWorker是在Java6中引入的,所以我们不能再使用它了 如果我只需要在后台做一些事情,然后在完成后在GUI中进行通信,那么以下内容是否可以接受?还是我忘记了一些重要的事情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,
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将其移植到了标准库中。