Java 线程池:在成员方法中创建和关闭线程池
在 Java 中,你可以通过 ThreadPoolExecutor 类来创建和管理线程池。如果将线程池定义为成员变量,则它只会在对象初始化时创建一次。如果在成员方法中执行了关闭线程池的语句,那么下次执行该成员方法时,线程池将不再可用。
为了确保每次执行成员方法时都使用一个新的线程池,可以将线程池的创建和关闭放在成员方法内部,而不是作为成员变量。
示例代码:
private void yourMethod() {
int threadPoolSize = 10; // 线程池大小
int maxThreadPoolSize = 20; // 最大线程池大小
long keepAliveTime = 60; // 线程空闲时间(单位:秒)
ThreadPoolExecutor executorService = new ThreadPoolExecutor(
threadPoolSize, // 核心线程池大小
maxThreadPoolSize, // 最大线程池大小
keepAliveTime, // 线程空闲时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<Runnable>() // 任务队列
);
List<CategoryTree> list = categoryService.treeList(parameter);
if (!list.isEmpty()) {
setChildList(list, parameter, executorService);
}
Map<String, Object> rsMap = Maps.newLinkedHashMap();
rsMap.put('data', list);
// 关闭线程池
executorService.shutdown();
return MessagePacket.newSuccess(rsMap, 'categoryTreeList success');
}
private void setChildList(List<CategoryTree> list, Map<String, Object> parameter, ThreadPoolExecutor executorService) {
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, executorService);
}
}
});
}
}
在上面的代码中,每次执行 yourMethod() 方法时,都会创建一个新的线程池,并在执行完毕后关闭线程池,确保每次执行该方法时都使用一个新的线程池。
原文地址: https://www.cveoy.top/t/topic/b29f 著作权归作者所有。请勿转载和采集!