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

时间:2010-08-17 15:42:08

标签: java swing event-dispatch-thread

在桌面Java 1.5应用程序中(它必须在许多MacOS X机器上运行,因为Apple政治而难以看到1.6 VM)在EDT之外执行冗长计算的正确方法是什么?

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

这是一种方法:

        final Thread t = new Thread( new Runnable() {
            public void run() {
                crunchData();
            }
        } );
        t.start;

我的意思是:这就是我想要的,但每次用户启动一个可能长时间运行的任务我都使用上面的习语。而且我觉得我总是不必要地创造了很多任务(此外,虽然有时操作可能很长,但有时它不会,在这种情况下,我希望应用程序尽可能负责)。

另一种方法是让另一个(非EDT)线程(或线程池)始终运行,比如等待阻塞队列并执行,例如, Runnable 我会在任何需要执行冗长操作的地方入队。

什么是 处理此问题的正确方法?

编辑:处理易于安装SwingWorker的内容的正确方法是什么?在SwingWorker到来之前,人们是如何处理这个问题的?这似乎是非常基本的?

1 个答案:

答案 0 :(得分:3)

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