多线程队列 httpClient 示例
时间: 2023-07-17 07:07:59 浏览: 200
以下是一个使用多线程和队列结合 HttpClient 的示例代码:
```java
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadQueueHttpClientExample {
public static void main(String[] args) {
BlockingQueue<String> urlQueue = new ArrayBlockingQueue<>(10); // 存放待请求的 URL 的队列
ExecutorService executorService = Executors.newFixedThreadPool(5); // 创建线程池
HttpClient httpClient = HttpClientBuilder.create().build();
// 生产者线程,将需要请求的 URL 放入队列
Thread producerThread = new Thread(() -> {
try {
for (int i = 0; i < 100; i++) {
urlQueue.put("https://api.example.com/endpoint" + i); // 替换为实际的接口地址
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 消费者线程,从队列中取出 URL 并发送 HTTP 请求
Thread consumerThread = new Thread(() -> {
try {
while (true) {
String url = urlQueue.take();
executorService.execute(() -> {
try {
HttpGet httpGet = new HttpGet(url);
HttpResponse response = httpClient.execute(httpGet);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuilder responseContent = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
responseContent.append(line);
}
System.out.println("Response: " + responseContent.toString());
} catch (IOException e) {
e.printStackTrace();
}
});
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
producerThread.start();
consumerThread.start();
}
}
```
在上述示例中,我们创建了一个大小为10的阻塞队列,用于存放待请求的 URL。然后创建了一个固定大小为5的线程池,用于执行 HTTP 请求。生产者线程不断地将需要请求的 URL 放入队列中,消费者线程从队列中取出 URL 并发送 HTTP 请求。
在消费者线程中,我们使用 HttpClient 发起 HTTP GET 请求,并将响应内容输出到控制台。可以根据实际需求对响应内容进行进一步处理。
通过多线程和队列的结合,我们可以实现并发发送 HTTP 请求,并控制请求的数量和速率。同时,由于使用了线程池和阻塞队列,可以提高程序的性能和效率。
需要注意的是,在实际应用中,你可能需要根据第三方接口的要求进行适当的设置,如请求头、请求参数等。此外,还可以根据具体需求使用其他类型的队列或自定义的队列实现,并根据实际情况进行适当的调整和完善。
阅读全文