Java多线程获取分类树数据并优化代码
Java多线程获取分类树数据并优化代码
本文将介绍使用多线程获取分类树数据并优化代码的方法。
代码示例
List<CategoryTree> list = categoryService.treeList(parameter);
if (!list.isEmpty()) {
setChildList(list, parameter);
}
Map<String, Object> rsMap = Maps.newLinkedHashMap();
rsMap.put('data', list);
// 关闭线程池
executorService.shutdown();
return MessagePacket.newSuccess(rsMap, 'categoryTreeList success');
}
int threadPoolSize = 10; // 线程池大小
int maxThreadPoolSize = 20; // 最大线程池大小
long keepAliveTime = 60; // 线程空闲时间(单位:秒)
ThreadPoolExecutor executorService = new ThreadPoolExecutor(
threadPoolSize, // 核心线程池大小
maxThreadPoolSize, // 最大线程池大小
keepAliveTime, // 线程空闲时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<Runnable>() // 任务队列
);
private void setChildList(List<CategoryTree> list, Map<String, Object> parameter) {
for (CategoryTree categoryTree : list) {
executorService.execute(() -> {
synchronized (this) {
parameter.put('parentId', categoryTree.getCategoryId());
List<CategoryTree> childList = categoryService.treeList(parameter);
if (!childList.isEmpty()) {
categoryTree.setChildList(childList);
setChildList(childList, parameter);
}
}
});
}
}
代码优化
关闭线程池的代码应该放在所有任务执行完毕后,即在返回结果之前。
在你的代码中,可以将关闭线程池的代码放在返回结果之前,即在 return MessagePacket.newSuccess(rsMap, 'categoryTreeList success'); 之前。
修改后的代码如下:
List<CategoryTree> list = categoryService.treeList(parameter);
if (!list.isEmpty()) {
setChildList(list, parameter);
}
Map<String, Object> rsMap = Maps.newLinkedHashMap();
rsMap.put('data', list);
// 关闭线程池
executorService.shutdown();
return MessagePacket.newSuccess(rsMap, 'categoryTreeList success');
总结
本文介绍了使用多线程获取分类树数据并优化代码的方法,确保线程池在所有任务执行完毕后关闭。希望对您有所帮助。
原文地址: https://www.cveoy.top/t/topic/b2il 著作权归作者所有。请勿转载和采集!