多线程http请求工具类--批量请求同一接口

385 阅读1分钟

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpUtil {
    private static final int MAX_THREADS = 10;

    /**
     * 发送HTTP GET请求,并返回响应结果
     * @param url 请求的URL地址
     * @param count 请求的次数
     * @return 每次请求的响应结果数组
     * @throws InterruptedException
     */
    public static String[] get(String url, int count) throws InterruptedException {
        String[] results = new String[count]; // 用于存储每次请求的响应结果
        Thread[] threads = new Thread[MAX_THREADS]; // 用于存储每个线程对象

        // 将请求次数均分成MAX_THREADS个子列表,并为每个子列表创建一个线程
        for (int i = 0; i < MAX_THREADS; i++) {
            int start = i * (count / MAX_THREADS);
            int end = (i == MAX_THREADS - 1) ? count : (i + 1) * (count / MAX_THREADS);
            threads[i] = new Thread(new HttpTask(url, start, end, results));
            threads[i].start(); // 启动线程
        }

        // 等待所有线程执行完毕
        for (int i = 0; i < MAX_THREADS; i++) {
            threads[i].join(); // 等待线程结束
        }

        return results; // 返回每次请求的响应结果
    }

    /**
     * 用于发送HTTP请求的线程任务
     */
    static class HttpTask implements Runnable {
        private String url; // 请求的URL地址
        private int start; // 子列表起始下标
        private int end; // 子列表结束下标
        private String[] results; // 存储每次请求的响应结果

        public HttpTask(String url, int start, int end, String[] results) {
            this.url = url;
            this.start = start;
            this.end = end;
            this.results = results;
        }

        public void run() {
            for (int i = start; i < end; i++) { // 遍历子列表中的每个元素
                HttpURLConnection conn = null;
                StringBuilder content = new StringBuilder(); // 用于存储HTTP响应内容

                try {
                    URL url = new URL(this.url);
                    conn = (HttpURLConnection) url.openConnection();

                    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    String line;
                    while ((line = in.readLine()) != null) {
                        content.append(line); // 读取HTTP响应内容
                    }
                    in.close(); // 关闭输入流

                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (conn != null) {
                        conn.disconnect(); // 断开HTTP连接
                    }
                }

                results[i] = content.toString(); // 将HTTP响应内容存储到results数组中
            }
        }
    }
}