【发布时间】:2019-12-03 09:43:26
【问题描述】:
我目前正在对软件进行各种性能改进。由于它使用 SWT 作为它的 GUI,我遇到了一个问题,在某些情况下,在显示线程中创建了很多 UI 元素。 由于我之前的人并没有真正注意在显示线程之外进行任何计算,因此整个软件在启动时可能会在几秒钟内无响应。 我现在已经隔离了需要在显示线程中执行的代码,我现在正在计算我提交到固定线程池的 Runnables 中的所有其他内容。 我正在使用这样的游泳池:
public abstract class AbstractChartComposite {
private static ExecutorService pool = Executors.newFixedThreadPool(8);
private List<String> currentlyProcessingChartItems = new ArrayList<>();
protected void doCalculate(constraints){
for (IMERuntimeConstraint c : constraints) {
if(!currentlyProcessingChartItems.contains(c.getId())){
currentlyProcessingChartItems.add(c.getId());
pool.submit(new Runnable(){
@Override
public void run() {
try{
createChartItem(c);
currentlyProcessingChartItems.remove(c.getId());
}catch(Throwable e){
e.printStackTrace();
}
}
});
}
}
}
}
我现在想知道,一旦创建了所有 UI 元素,让线程池处于空闲状态是否有任何缺点。我不能真正关闭它以进行垃圾收集,因为当需要创建新元素时,用户输入将再次需要它。 那么让没有提交的 Runnable 运行的线程池有什么主要缺点吗?
【问题讨论】:
-
并非如此。只是占用一些内存。你也可以有一个非固定的线程池,它也可以缩小到零。
-
我建议你展示用于创建线程池的代码。
-
@Thilo 所以你可能会建议像缓存线程池之类的东西?对我来说,这听起来是个好主意。
-
请注意,您正在从多个线程访问
ArrayList(不是线程安全的),包括修改。总有一天会彻底崩溃的。 -
@Holger 谢谢,我会在我的代码中解决这个问题
标签: java multithreading performance threadpool