【发布时间】:2018-11-23 10:26:37
【问题描述】:
我有一个扩展 SwingWorker 的抽象类,名为 FetchWorker,用于获取一些后台数据并修改为我的应用程序获取的数据。在我的FetchWorker 中是StatisticLayerController 的内部类。此 StatisticLayerController 由两个类扩展。我在FetchWorker 中初始化新线程以进行一些计算。我以前用TrackHistoryLayerController.的ExecutorService
如下:
public class TrackHistoryLayerController extends StatisticLayerController
{
private final ExecutorService heatMapAdderExecutor;
...
public AdsbFetchWorker(...) extends FetchWorker
{
super(...);
}
@Override
protected final List<ADSBTrack> doInBackground() throws Exception
{
filtered.forEach( track -> {
this.heatMapAdderExecutor.submit( new HeatmapAdderHelper( ... ) );
} );
while ( this.latch.getCount() != 0 )
{
this.publishValue( ( int ) this.latch.getCount() );
}
this.latch.await();
this.publishValue( ( int ) this.latch.getCount() );
if ( this.createImage() )
{
this.placeImage();
}
return filtered;
}
}
所以在这种情况下HeatMapAdderHelper 是我的助手线程,它为我做一些计算。一切正常,一切都很好。
但是现在我想多改变一点类结构,我想让我的Controller 类abstract 并且我不再希望我的Worker 类成为一个内部类。
我的问题是,我不能(不应该)在 Worker 内创建 ExecutorService,因为每次调用事件时都会初始化工作程序。我唯一能做的就是将 ExecutorService 从Controller 作为参数传递给SwingWorker,但这是一个好习惯吗?提前谢谢你。
【问题讨论】:
-
使用
static执行器还是单例实例? -
@daniu 你的意思是在工人内部对吧?但是我不是为所有控制器都提供了一个 ExecutorService 吗?
-
是的,你知道。但请记住,
ExecutorService是一个包装器,用于管理作为全局资源的线程;在全球范围内管理它们是有意义的(并且只有少数几个)。仅仅添加线程(或ExecutorServices,就此而言)不会神奇地获得更多性能。 -
@daniu 所以你的意思是每个
Controller都有ExecutorService并没有比只有一个一个为我提供一些额外的性能>ExecutorService为所有Controllers? -
是的,这就是我要说的。拥有 4 个
ExecutorServices 和 1 个线程和 1 个ExecutorService和 1 个线程在性能方面基本相同 - 但是后者可能会更好地分配工作。
标签: java multithreading swing executorservice swingworker