我正在设计一个 Java GUI 驱动的应用程序,该应用程序运行许多单独的任务,每个任务都在其自己的 SwingWorker 扩展类中。这是我使用的正常设计,目的是在它们自己的线程上运行任务,并仍然保持 EDT 自由更新 GUI。每个 SwingWorker 都使用 Executors.newCachedThreadPool 在其自己的线程上启动。
但是,在一个特定的类中,有一个任务需要相当长的时间来处理。该任务包含一个 for 循环,最多可执行六次计算。
我曾想过在各自的线程中实现六个计算中的每一个以加快处理时间,但我不确定实现这个的最佳方法。
是否可以同时扩展 SwingWorker 和实现 Runnable,然后在 for 循环中使用一个 void Run() 方法,每次启动一个新的线程,或者使用一个缓存的线程池。
还是我最好只使用标准的 Thread() 实现?
如有任何意见或建议,我们将不胜感激。
提前致谢
乔希
最佳答案
user988052 当然是对的 - 如果您没有多核 CPU,在六个不同的线程中进行计算实际上会减慢您的应用程序,因为线程的创建和管理会带来开销。
如果您想在六个单独的线程中执行此计算,您可以使用 SwingWorker 作为管理线程并在其中产生 5-6 个新线程。使用 ExecutorService
将是可行的方法,因为它使用线程池,从而最大限度地减少了线程的创建和处置带来的开销。
编辑:回答您的评论:
我认为最好的方法是在 Runnable
中实现你的计算(这样六个计算中的每一个都可以单独运行),然后简单地使用一个 ExecutorService
,实例化您的 Runnable
六次并使用 ExecutorService.submit(Runnable task)
。您可以在 SwingWorker.doInBackground()
方法中完成所有这些操作。
您永远不应该自己调用 run()
方法 - 让它由 Thread/ExecutorService 完成。
关于Java Swingworker 和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220974/