2010-08-17 56 views
3

在桌面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之前,人们如何处理这个(这看起来很基本)?

+0

如果最后一轮crunchdata尚未完成,会发生什么情况?你的代码是否需要:取消正在运行的实例;不开始新的实例;或者在开始新实例之前等待正在运行的实例完成。 – 2010-08-17 15:59:22

+0

@Devon_C_Miller:这已经被照顾了。有些可以并行运行,另一些可以取消以前运行的实例等等。它更多的是关于如何在Java(1.5,我没有默认情况下没有SwingWorker)下做这个工作。 – NoozNooz42 2010-08-17 16:07:14

+0

为了响应你的编辑,人们仍然使用'SwingWorker',或者将RDIUDI的评论中提供的代码复制到下面的答案中,写了一些非常相似的东西。用你的代码打包。 – justkt 2010-08-18 13:28:07

回答

3

推荐的方法是让您的EDT代码开始SwingWorker,该代码将完成外部工作并将结果返回给您。

+0

我在Java 5上(这需要运行在许多Mac OS X电脑上,永远不会得到Java 6 ...谢谢Apple;) – NoozNooz42 2010-08-17 16:06:00

+1

@ NoozNooz42 - 您可以获取SwingWorker旧教程版本的代码并使用尽管如此。它仍然是浮动的,并且仍然是Java 6之前的标准版。 – justkt 2010-08-17 16:08:57

+0

像@justkt提到的那样,SwingWorker在Java 6之前就已经存在。您可以随时获取代码(例如:http://www.koders.com/java/fidAC10A778A6FF41B6C3229B820BF3C864C4BF019F .aspx?s = swingworker),并将它移植到Java 5. – Riduidel 2010-08-18 07:31:41

相关问题