Java 在EDT之外执行长时间运行操作的正确方法是什么?

Java 在EDT之外执行长时间运行操作的正确方法是什么?,java,swing,event-dispatch-thread,Java,Swing,Event Dispatch Thread,在桌面Java 1.5应用程序中(它必须在许多MacOS X机器上运行,由于苹果的政治原因,这些机器将无法看到1.6虚拟机),在EDT之外执行长时间计算的正确方法是什么 比如说,当用户点击一个按钮开始一项操作时:我收到EDT上的通知,我想运行一些方法(比如crunchData()) 这里有一种方法: final Thread t = new Thread( new Runnable() { public void run() {

在桌面Java 1.5应用程序中(它必须在许多MacOS X机器上运行,由于苹果的政治原因,这些机器将无法看到1.6虚拟机),在EDT之外执行长时间计算的正确方法是什么

比如说,当用户点击一个按钮开始一项操作时:我收到EDT上的通知,我想运行一些方法(比如
crunchData()

这里有一种方法:

        final Thread t = new Thread( new Runnable() {
            public void run() {
                crunchData();
            }
        } );
        t.start;
我的意思是:这正是我想要的,但每次用户启动一个可能长时间运行的任务时,我都会使用上面的习惯用法。我觉得我总是在不必要地创建大量任务(此外,尽管有时操作可能很长,有时不会,在这种情况下,我希望应用程序尽可能负责)

另一种方法是让另一个(非EDT)线程(或线程池)始终运行,比如说等待阻塞队列,然后执行(比如说)可运行,即我将在需要执行长时间操作的任何地方排队

正确的处理方法是什么


编辑:是处理安装简单的东西的正确方法
SwingWorker
?在SwingWorker出现之前,人们是如何处理这一问题的(这似乎很基本)?

推荐的方法是让您的EDT代码启动a,它将在外部执行任务并将结果返回给您。

如果最后一次运行crunchdata尚未完成,会发生什么?您的代码是否需要:取消正在运行的实例;不启动新实例;或者等待正在运行的实例完成,然后再启动新实例。@Devon_C_Miller:这已经解决了。有些可以并行运行,有些可以取消以前运行的实例,等等。这实际上更多的是关于如何在Java(1.5,默认情况下我没有SwingWorker)下实现这一点。为了响应您的编辑,人们仍然使用
SwingWorker
,或者,删除Riduidel对下面答案的注释中提供的代码,写了一些非常相似的东西。用你的代码打包。我使用的是Java 5(这必须在很多MacOS X计算机上运行,而这些计算机永远不会使用Java 6…谢谢Apple;)@NoozNooz42-你可以获得SwingWorker旧教程版本的代码并使用它。它仍然漂浮在那里,仍然是Java6之前的标准版本。就像@justkt提到的,SwingWorker在Java6之前就已经存在了。您可以随时获取代码(例如,这里:)并将其向后移植到Java5。但请注意,swingworker往往会给我们带来一个巨大的池,并使其成为一个新的麻烦。我还在挖这个,很难。