下面是一个使用线程池执行多线程请求的示例代码,该示例使用PoolingHttpClientConnectionManager来管理连接池:
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class HttpClientExample {
public static void main(String[] args) {
// 创建连接池管理器
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
// 设置最大连接数
connectionManager.setMaxTotal(10);
// 设置每个路由的最大连接数
connectionManager.setDefaultMaxPerRoute(5);
// 创建HttpClient对象,使用连接池管理连接
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.build();
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
try {
// 提交多个任务给线程池执行
for (int i = 0; i < 5; i++) {
RequestTask task = new RequestTask(httpClient);
executorService.submit(task);
}
// 等待所有任务完成
executorService.shutdown();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭HttpClient连接
httpClient.close();
} catch (Exception e) {
e.printStackTrace();
}
// 关闭连接池
connectionManager.close();
}
}
static class RequestTask implements Runnable {
private final CloseableHttpClient httpClient;
public RequestTask(CloseableHttpClient httpClient) {
this.httpClient = httpClient;
}
@Override
public void run() {
try {
// 创建HttpGet请求
HttpGet httpGet = new HttpGet("https://api.example.com");
// 发送请求并获取响应
CloseableHttpResponse response = httpClient.execute(httpGet);
try {
// 获取响应实体
HttpEntity entity = response.getEntity();
// 处理响应内容
if (entity != null) {
String responseBody = EntityUtils.toString(entity);
System.out.println(Thread.currentThread().getName() + ": " + responseBody);
}
} finally {
// 关闭响应
response.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
在上述示例中,我们创建了一个PoolingHttpClientConnectionManager作为连接池管理器,并使用它来构建CloseableHttpClient对象。然后,我们创建了一个固定大小的线程池,最多同时执行5个任务。
每个任务是RequestTask类的一个实例,它接收共享的CloseableHttpClient实例,并在其run()方法中执行GET请求并处理响应。
通过将任务提交给线程池执行,我们可以并发地发送多个请求。最后,等待所有任务完成后关闭线程池、CloseableHttpClient和连接池中的连接。
请根据你的实际需求进行调整,例如设置合适的最大连接数、每个路由的最大连接数以及线程池的大小等。此示例仅用于说明如何使用连接池和线程池在多线程环境下执行并发请求。