在java应用中,经常会遇到在一个方法里面调用多个方法,比如在A方法中调用,B和C,B和C执行时间各需要1秒,A方法执行完至少需要2秒,如果A要调用更多的方法,需要更长的时间,用户体验是不好的,这时候可以把B和C放入线程池执行,那么最后执行的时长只需要1秒,大大提升性能,代码如下:
package com.org.boot.common.utils;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
/**
* 执行多个SQL查询,加入线层池,提升效率
* @author devg @Date 2019/8/4 6:50
*
* 用法demo:
* AsyncUtil asyncUitl = AsyncUtil.newInstance();
*
* * @param pageNum 第几页 * @param pageSize 每页大小 * @param serviceObj 服务实体 * @param methodName 执行方法
* * @param params 方法参数 * @param parameterTypes 方法参数类型
*
* asyncUitl.addQuery(pageNum,pageSize,roleService,"getRoleList",paramMap,Map.class);
* asyncUitl.addQuery(pageNum,pageSize,roleService,"getRoleList2",paramMap,Map.class);
* asyncUitl.shutdown();
* List> roleList = asyncUitl.getResult("getRoleList");
* List> roleList2 = asyncUitl.getResult("getRoleList2");
*/
public class AsyncUtil {
/**
* 线程池
*/
private ExecutorService executorService;
/**
* 任务列表
*/
private Map futureTaskMap;
public AsyncUtil(){
this.executorService = Executors.newFixedThreadPool(10);
this.futureTaskMap = new HashMap<>();
}
public AsyncUtil(int threadPoolNum){
this.executorService = Executors.newFixedThreadPool(threadPoolNum);
this.futureTaskMap = new HashMap<>();
}
public static AsyncUtil newInstance(){
return newInstance(4);
}
public static AsyncUtil newInstance(int threadPoolNum){
return new AsyncUtil(threadPoolNum);
}
/**
* @param serviceObj 服务实体
* @param methodName 执行方法
* @param params 方法参数
* @param parameterTypes 方法参数类型
*/
public void addQuery(Object serviceObj, String methodName,Object params, Class>... parameterTypes) {
addQuery(methodName,false,null,null,serviceObj,methodName,params,parameterTypes);
}
/**
* 执行多个SQL查询,加入线层池,提升效率
*
* @param serviceObj 服务实体
* @param methodName 执行方法
* @param params 方法参数
* @param parameterTypes 方法参数类型
*/
public void addQuery(Integer pageNum,Integer pageSize,Object serviceObj, String methodName,Object params, Class>... parameterTypes) {
addQuery(methodName,true,pageNum,pageSize,serviceObj,methodName,params,parameterTypes);
}
/**
* @param serviceObj 服务实体
* @param methodName 执行方法
* @param params 方法参数
* @param parameterTypes 方法参数类型
*/
public void addQuery(String key,Object serviceObj, String methodName,Object params, Class>... parameterTypes) {
addQuery(key,false,null,null,serviceObj,methodName,params,parameterTypes);
}
/**
* 执行多个SQL查询,加入线层池,提升效率
*
* @param serviceObj 服务实体
* @param methodName 执行方法
* @param params 方法参数
* @param parameterTypes 方法参数类型
*/
public void addQuery(String key,Integer pageNum,Integer pageSize,Object serviceObj, String methodName,Object params, Class>... parameterTypes) {
addQuery(key,true,pageNum,pageSize,serviceObj,methodName,params,parameterTypes);
}
/**
* 执行多个SQL查询,加入线层池,提升效率
*
* @param page 是否分页
* @param pageNum 第几页
* @param pageSize 每页大小
* @param serviceObj 服务实体
* @param methodName 执行方法
* @param params 方法参数
* @param parameterTypes 方法参数类型
*/
public void addQuery(String key,boolean page,Integer pageNum,Integer pageSize,Object serviceObj, String methodName,Object params, Class>... parameterTypes) {
FutureTask> ft1 = new FutureTask<>(new Callable>() {
@Override
public FutureTaskResult call() throws Exception {
if (page) {
PageHelper.startPage(pageNum, pageSize, true);
}
Method md = serviceObj.getClass().getMethod(methodName, parameterTypes);
Object obj = md.invoke(serviceObj, params);
FutureTaskResult futureTaskResult = new FutureTaskResult();
futureTaskResult.setData(obj);
futureTaskResult.setKey(methodName);
return futureTaskResult;
}
});
futureTaskMap.put(key,ft1);
executorService.execute(ft1);
}
/**
* @param key
* @param
* @return
*/
public T getResult(String key) throws InterruptedException, ExecutionException {
Future future = futureTaskMap.get(key);
Object obj = future.get();
System.out.println("异步任务查询结果:" + JSON.toJSON(obj));
FutureTaskResult result = (FutureTaskResult) obj;
return result.getData();
}
/**
* 关闭线程池
*/
public void shutdown(){
executorService.shutdown();
}
}
public class FutureTaskResult {
private String key;
private T data;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}