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

标签 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 出现之前,人们是如何处理这个问题的(这看起来很基本)?

最佳答案

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

关于java - 在 EDT 之外执行长时间运行的操作的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3504266/

相关文章:

java - nar-maven-plugin javah 失败,常量池中的字节标记无效 : 18

objective-c - 覆盖调度命令

java - 包含 DTOS 的列表仅打印出指针

java - 每次循环运行不同的方法

java - JFrame最大化时如何调整JPanel的大小?

java - JButton Java 的继承 - 重写方法问题

java - 多次通过单击 swing 中的按钮更改标签文本不起作用

Java GUI 在联网之前挂起

java - 奇怪的 EDT 违规,不包含我的代码

java - 仅反序列化 Java 中必需的字段