多线程优化函数中包含多个HTTP接口响应速度慢的问题

一个人想着一个人 提交于 2020-08-05 02:47:04

多线程优化函数中包含多个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
用友网络科技有限公司四川分公司
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!