我们的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();
}
答案 0 :(得分:10)
我会让其他人评论您的代码的适用性,但作为替代方案,您可以下载Swingworker的后端以用于Java 5 here。
答案 1 :(得分:3)
您的代码应该正常运行;当然你会失去SwingWorker的所有其他功能(返回部分结果和进度,可以取消,支持听众),
答案 2 :(得分:2)
看看Foxtrot,它的工作方式与大多数Swing并发库不同。
它不是触发后台线程来执行长时间运行的任务,而是通过在Swing EDT上执行长时间运行的任务并启动新线程来处理GUI来模拟Swing在显示模式对话框时所采用的方法事件
当处理一个长时间运行的任务,返回一个你需要立即执行的值时,这会产生一个非常好的,程序性/非并发的程序代码(就像检查{{1的返回值一样) }})。
答案 3 :(得分:1)
如果您的产品中的LGPL代码没有任何问题,您可以使用SwingWorker的后端版本到Java 5.