Java Swingworker和多线程

时间:2012-02-10 00:16:58

标签: java multithreading swing swingworker

我正在设计一个Java GUI驱动的应用程序,该应用程序运行许多单独的任务,每个任务都在自己的SwingWorker扩展类中。这是我使用的正常设计,以便在自己的线程上运行任务,并且仍然可以让EDT免费更新GUI。每个SwingWorker都使用Executors.newCachedThreadPool在自己的线程上启动。

但是,在一个特定的类中,有一个任务需要相当长的时间来处理。该任务包含一个for循环,最多可执行六次计算。

我已经考虑过在自己的线程中实现六个计算中的每一个以加快处理时间,但我不确定实现它的最佳方法。

是否可以扩展SwingWorker并实现Runnable,然后在for循环中使用void Run()方法,每次都启动一个新的Thread,或者使用cachedThreadPool。

或者我最好只使用标准的Thread()实现吗?

任何意见或建议都将不胜感激。

提前致谢

约什

1 个答案:

答案 0 :(得分:5)

user988052当然是对的 - 如果你没有多核CPU,那么在六个不同线程中进行计算实际上会降低你的应用程序的速度,因为线程的创建和管理带来了开销。

如果你想在六个不同的线程中进行这种计算,你可以使用SwingWorker作为管理线程,并在其中产生5-6个新线程。然后使用ExecutorService将成为可行的方法,因为它使用了一个线程池,从而最大限度地减少了创建和处理线程所带来的开销。

编辑:回答你的评论:

我认为最好的方法是在Runnable中实现计算(以便六个计算中的每一个可以单独运行),然后只需使用ExecutorService,实例化Runnable六次并使用ExecutorService.submit(Runnable task)。您可以在SwingWorker.doInBackground()方法中完成所有这些操作。

你永远不应该自己调用run()方法 - 让它由Thread / ExecutorService完成。