多线程优化函数中包含多个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

回到顶部