多线程优化函数中包含多个HTTP接口响应速度慢的问题
大型企业使用的系统越来越多,使用统一的集成门户做为入口,并以系统为单位注册新闻,待办任务,预警消息等插件在使用过程中因网络或者接口的原因导致响应的时间增长,比如在加载我的待办任务的时候可能需要门户分别向A,B,C,D等系统分别请求各自的待办任务并组合返回前端;
多线程工具类,解决多线程返回值的问题
问:实现多线程的方式有几种?答:实际上是有3种
0:继承Thread类
1:实现Runable 接口 不带返回值
1:实现Callable 接口带返回值
问:启动线程的方式答:
0:直接启动一个Thread线程
newThread().start();
1:启动一个Runable
Runnablerunable=newRunnable() {
@Override
publicvoidrun() {
System.out.println("thread run ....");
}
};
newThread(runable).start();
2:启动一个Callable
Callablecall=newCallable<Object>() {
@Override
publicObjectcall() throwsException {
// TODO Auto-generated method stub
returnnull;
}
//TODO ...other method
};
//由于new Thead();无法接受一个Callable的参数,过桥转一下
FutureTask<Object>futureTask=newFutureTask<Object>(call);
newThread(futureTask).start();
packagecom.yonyou.iuap.portal.integration.utils;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.concurrent.Callable;
importorg.apache.log4j.Logger;
importcom.yonyou.iuap.portal.integration.util.HttpUtil;
importcom.yonyou.iuap.portal.integration.util.JsonUtil;
public classThreadHandlerimplementsCallable<List> {
privateLoggerlog=Logger.getLogger(getClass());
privateList result= null ;
/**
* @discription 多线程带返回值调用类
* @param url
* @param map
*/
publicThreadHandler (Stringurl,Classclazz){
Stringsb= null ;
try {
//TODO HTTPGET
longstart=System.currentTimeMillis();
System.out.println("任务请求开始:"+start);
sb=HttpUtil.get(url);
if(sb!=null&&!sb.isEmpty()){
result= (List) JsonUtil.fromJson(sb.trim(),ArrayList.class, newClass[] {clazz});
}
System.out.println("任务请求结束:总共耗时ms:"+(System.currentTimeMillis()-start));
} catch (Exceptione) {
log.error("HTTP请求出错:"+e.getMessage());
}
}
@Override
publicListcall() throwsException {
returnresult;
}
}
代码支持:
//long start = System.currentTimeMillis();// 申明线程池
ExecutorServiceexc=Executors.newFixedThreadPool(allsys.length);
// 申明数据回调处理类List<Future<JSONObject>>
List<Future<List>>futures=newArrayList<Future<List>>();
for (StringURL : allsys) {
// 申请单个线程执行类
//String URL = "http://0.0.0.0:8080/service/queryOBJ";
ThreadHandlercall=newThreadHandler(URL, Clazz.class);
// 提交单个线程
Future<List>future=exc.submit(call);
// 将每个线程放入线程集合, 这里如果任何一个线程的执行结果没有回调,线程都会自动堵塞
futures.add(future);
}
// 所有线程执行完毕之后会执行下面的循环
for (Future<List>task : futures) {
Listrst=task.get();
if(rst!=null){
result.addAll(rst);
}
}
//System.out.println("全部任务请求结束:总共耗时ms:"+(System.currentTimeMillis()-start));
// 关闭线程池
exc.shutdown();
wangmob@yonyou.com用友网络科技有限公司四川分公司
以上是 多线程优化函数中包含多个HTTP接口响应速度慢的问题 的全部内容, 来源链接: utcz.com/z/517959.html