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