ThreadHttpRequest

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;

public class ThreadHttpRequest {
    // 申明线程池
    ExecutorService executorServie = new ThreadPoolExecutor(3, 12, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(200));
    public Map ShiPinThreadHandle(List<Caculator> caculators,RestUtils restUtils) throws JSONException, IOException, InterruptedException, ExecutionException {
        // 组合线程请求参数
        JSONArray requestParameterArray = new JSONArray();
        for (int i = 0; i < caculators.size(); i++) {
            Caculator caculator = caculators.get(i);
            JSONObject obj = new JSONObject();
            obj.put(FinalFieldName.REQUESTURL, caculator.getRequestUrl());
            obj.put(FinalFieldName.PARAMDATA, caculator.getDataType());
            obj.put(FinalFieldName.APINAME, caculator.getApiName());
            obj.put(FinalFieldName.REQUESTYPE, caculator.getRequesType());
            requestParameterArray.add(obj);
        }


        // 申明数据回调处理类List<Future<JSONObject>>
        List<Future<JSONObject>> futures = new ArrayList<Future<JSONObject>>();
        for (int i = 0; i < requestParameterArray.size(); i++) {

            JSONObject singleobje = requestParameterArray.getJSONObject(i);
            // 申请单个线程执行类
            ShiPinThreadHandleRequest call = new ShiPinThreadHandleRequest(singleobje,restUtils);
            // 提交单个线程
            Future<JSONObject> future = executorServie.submit(call);
            // 将请求过的数据移除
            requestParameterArray.remove(i);
            // 将每个线程放入线程集合, 这里如果任何一个线程的执行结果没有回调,线程都会自动堵塞
            futures.add(future);
        }
        // 所有线程执行完毕之后会执行下面的循环,然后通过循环每个个线程后执行线程的get()方法每个线程执行的结果
        Map<String,String> map = new HashMap<String,String>();
        for (Future<JSONObject> future : futures) {
            JSONObject json = future.get();
            // 可能需要使用缓存,将查询的数据放入缓存
            map.put(json.getString(FinalFieldName.APINAME), (String) json.get(FinalFieldName.APIVALUE));
        }
        // 关闭线程池
        executorServie.shutdown();
        // 这里将查询的数据返回,如果放入缓存则此处返回空
        return map;
    }
}

 

posted @ 2022-10-28 21:00  MING5135  阅读(13)  评论(0编辑  收藏  举报