Java Swingworker 和多线程

标签 java multithreading swing swingworker

我正在设计一个 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/

相关文章:

java - 在java记事本中查找单词jtextfield

java - 如何使用 Java 将 float 转换为 int

c# - 使用 Invoke 从另一个线程获取 tabControl SelectedTab

java - 调用 pack() 后如何在面板上画一条线?

ios - 如何防止 UI 快速卡住?

c# - 为什么锁定我们要更改的对象是一种不好的做法?

java - 如何用Java制作一个图 block

java - JPanel(null) 不显示 JLabels

java - 从 Java 调用 C++,但 Java 加载了错误的 Glibc 版本

java - 线程 "main"java.lang.NoClassDefFoundError : com/google/common/base/Preconditions 中的 Google+ API 异常