在桌面Java 1.5应用程序中(它必须运行在许多MacOS X机器上,由于Apple政治的原因,这些机器会看到1.6 VM),在EDT之外执行冗长计算的正确方法是什么?在EDT之外执行长时间运行的正确方法是什么?
举例说,当用户点击一个启动操作的按钮时:我在EDT上得到通知,我想运行一些方法(比如说crunchData()
)。
下面是做这件事:
final Thread t = new Thread(new Runnable() {
public void run() {
crunchData();
}
});
t.start;
我的意思是:这个我想要做什么,但每一次用户开始一个潜在的长时间运行的任务,我用上面的成语。我觉得我总是不必要地创造大量任务(而且,尽管有时操作可能很长,有时候不会,在这种情况下,我希望应用程序尽可能负责任)。
另一种方式来做到这一点是有另一个(非EDT)线程(或线程池),始终在运行,说等待一个阻塞队列和执行,比方说,Runnable的我会排队的地方我需要执行冗长的操作。
什么是的正确的方法来处理这个问题?
编辑:是正确的方式来处理一些简单的安装SwingWorker
?在SwingWorker
之前,人们如何处理这个(这看起来很基本)?
如果最后一轮crunchdata尚未完成,会发生什么情况?你的代码是否需要:取消正在运行的实例;不开始新的实例;或者在开始新实例之前等待正在运行的实例完成。 – 2010-08-17 15:59:22
@Devon_C_Miller:这已经被照顾了。有些可以并行运行,另一些可以取消以前运行的实例等等。它更多的是关于如何在Java(1.5,我没有默认情况下没有SwingWorker)下做这个工作。 – NoozNooz42 2010-08-17 16:07:14
为了响应你的编辑,人们仍然使用'SwingWorker',或者将RDIUDI的评论中提供的代码复制到下面的答案中,写了一些非常相似的东西。用你的代码打包。 – justkt 2010-08-18 13:28:07