Java Swingworker和多线程

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

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

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

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

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

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

提前致谢

玩笑

解决方法

user988052当然是正确的 – 如果你没有多核CPU,那么在六个不同的线程中进行计算实际上会减慢你的应用程序,因为线程的创建和管理带来了开销.

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

编辑:回答你的评论:

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

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

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...