SwingWorker
用于以下目的:
- 在不同的线程中运行长时间运行的任务,以防止GUI无响应
- 通过
done()
方法,在任务结束时使用由长时间运行的任务生成的结果更新GUI。 - 使用
publish()
和process()
方法发布和处理任务生产的中间结果,从而定期更新GUI。
SwingUtilities.invokeLater()
可执行以下任务:
- 不需要从EDT执行
SwingWorker.execute()
方法,可以执行ExecutorService.submit(new MyRunnable())
,因为它还将创建另一个线程,该线程可以执行长时间运行的任务。 - 要在任务结束时更新GUI,我们可以将代码(编写在Case1的
done()
方法中)放置在任务的末尾:SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())
。 - 要在任务执行过程中更新GUI,我们可以将代码(编写在Case1的
process()
方法中)放置在我们在Case1中调用publish()
方法的位置:SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())
。
我提出这个问题是因为在问题Java-SwingWorker-我们可以从其他SwingWorker而不是EDT调用一个SwingWorker吗中指定的问题可以通过SwingUtilities.invokeLater()
来解决,但无法使用SwingWorker
解决。