java多线程处理

import com.alibaba.fastjson.JSONObject;
import com.yl.platform.api.dto.RequestDTO;
import org.springframework.util.DigestUtils;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class HttpTest {

    //最大线程数
    public static int maxThreadCount = 20;
    //线程池
    public static ExecutorService executorService = Executors.newFixedThreadPool(maxThreadCount);
    //全部任务列表
    public static List<Integer> taskList = new CopyOnWriteArrayList<>();
    //正在处理的任务列表
    public static List<Integer> curTaskList = new CopyOnWriteArrayList<>();
    //失败任务列表
    public static List<Integer> failTaskList = new CopyOnWriteArrayList<>();
    //记录已完成任务
    public static Map<Integer,Integer> successTaskMap = new HashMap<>();

    public static void main(String[] args) throws Exception {

        long startTime = System.currentTimeMillis();

        String url = "http://***";
        String date = "2021-07-24";

        //检查当天任务是否已经完成,完成则退出

        //初始化任务
        for (Integer i = -999; i <= 999; i++) {
            taskList.add(i);
        }

        //去掉已完成的任务批次

        boolean running = true;
        try {
            while (running) {
                for(Integer ci: curTaskList){
                    if(successTaskMap.containsKey(ci)){
                        curTaskList.remove(ci);
                        taskList.remove(ci);
                    }
                }

                System.out.println("—————当前剩余任务数: " + taskList.size() + ",失败任务数: " + failTaskList.size()+ ",正在执行任务数: " + curTaskList.size());

                //错误任务量太多,退出执行
                if(failTaskList.size() >= 10) {
                    System.out.println("—————任务停止执行,失败任务数:" + failTaskList.size());
                    executorService.shutdown();
                    running = false;
                }

                if (taskList.size() > 0) {

                    int addNewCount = 0;

                    //添加新任务(需要去除正在执行的任务,避免重复处理)
                    for (Integer i : taskList) {
                        boolean isExists = false;
                        for (Integer ci : curTaskList) {
                            if (ci == i) {
                                isExists = true;
                                break;
                            }
                        }

                        //新任务,处理
                        if (!isExists) {
                            if (curTaskList.size() < HttpTest.maxThreadCount) {
                                addNewCount++;
                                curTaskList.add(i);
                                executorService.execute(new RunnableThreadDemo(url, date, i));
                            }
                        }
                    }

                    System.out.println("—————新加" + addNewCount + " 个任务,当前正在执行的任务数:" + curTaskList.size());

                    //等待1秒执行
                    Thread.sleep(1000);

                } else {
                    System.out.println("—————所有任务已完成:");
                    executorService.shutdown();
                    running = false;
                }
            }

            System.out.println("任务执行完成,总耗时 :" + (System.currentTimeMillis() - startTime) );
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static JSONObject getParam(String date, int modNumber) {

        String secretKey = "111";
        String userId = "test";

        String sql = "SELECT * FROM \n" +
                "  t_table t \n" +
                "WHERE date = '" + date + "' \n" +
                "  AND MOD(MURMUR_HASH3_32 (billcode), 1000) =" + modNumber;

        RequestDTO requestDTO = new RequestDTO();
        String reqId = UUID.randomUUID().toString();
        requestDTO.setReqId(reqId);
        requestDTO.setUserId(userId);
        requestDTO.setTimestamp(System.currentTimeMillis());
        requestDTO.setSql(sql);

        StringBuffer mulParamStr = new StringBuffer();
        mulParamStr.append("userId=").append(userId);
        mulParamStr.append("&secretKey=").append(secretKey);
        mulParamStr.append("&reqId=").append(reqId);
        mulParamStr.append("&timestamp=").append(requestDTO.getTimestamp());
        mulParamStr.append("&sql=").append(requestDTO.getSql());
        String md5Str = DigestUtils.md5DigestAsHex(mulParamStr.toString().getBytes());
        requestDTO.setSign(md5Str);

        return (JSONObject) JSONObject.toJSON(requestDTO);
    }

}

class RunnableThreadDemo implements Runnable {

    private String url;
    private String date;
    private int modNum;

    public RunnableThreadDemo(String url, String date, int modNum) {
        this.url = url;
        this.date = date;
        this.modNum = modNum;
    }

    @Override
    public void run() {
        try {
            long startTime = System.currentTimeMillis();
            String responseStr = HttpUtil.httpPost(url, HttpTest.getParam(date, modNum));
            if (null != responseStr) {
                JSONObject resultJson = (JSONObject) JSONObject.parse(responseStr);
                if (resultJson.getString("code").equals("1")) {
                    List<Map> resultDataList = resultJson.getObject("data", List.class);
                    System.out.println("i=" + modNum + "time:" + (System.currentTimeMillis() - startTime) + ",dataSize:" + resultDataList.size());
                    //insert to oracle

                    //标记任务已完成
                    System.out.println("i=" + modNum + " 任务执行完");
                    HttpTest.successTaskMap.put(modNum,1);
                } else {
                    HttpTest.failTaskList.add(modNum);
                    System.out.println("i=" + modNum + ",出错了,resultJson:" + resultJson);
                }
            }
        } catch (Exception e) {
            HttpTest.failTaskList.add(modNum);
            e.printStackTrace();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值