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');

总结

本文介绍了使用多线程获取分类树数据并优化代码的方法,确保线程池在所有任务执行完毕后关闭。希望对您有所帮助。

Java多线程获取分类树数据并优化代码

原文地址: https://www.cveoy.top/t/topic/b2il 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录