java模拟多线程http请求

该Java程序实现了模拟多线程进行HTTP请求的功能。通过创建`ServiceThreadTest`类并实现`Runnable`接口,每个线程执行HTTP POST请求。使用了Apache HttpClient库,设置超时时间,并将参数转换为NameValuePairs。程序中创建了一个线程池,启动两个线程分别发送请求。请求参数包括`apiversion`和`appversion`。
package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

/**java 模拟测试多线程测试http请求
 * @author wdh
 *
 */

public class ServiceThreadTest implements Runnable{
		
	private String url;
	
	private Map<String,Object> paramStr;
	
	public ServiceThreadTest(String url, Map<String,Object> paramStr) {
		super();
		this.url = url;
		this.paramStr = paramStr;
	}

	
	public String getUrl() {
		return url;
	}


	public void setUrl(String url) {
		this.url = url;
	}


	public  Map<String,Object> getParamStr() {
		return paramStr;
	}


	public void setParamStr(Map<String,Object> paramStr) {
		this.paramStr = paramStr;
	}


	@Override
	public void run() {
               // http请求实现方式
		CloseableHttpClient httpClient = HttpClients.createDefault();
		HttpPost post = new HttpPost(url);
		RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(10000).setConnectTimeout(10000)
				.setSocketTimeout(10000).build();
		CloseableHttpResponse response = null;
		try {
			List<NameValuePair> params = setHttpNameValues(paramStr);  
		    HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");
			post.setEntity(httpentity);
			post.setConfig(config);
			response = httpClient.execute(post);	
			HttpEntity entity = response.getEntity();
			String content = EntityUtils.toString(entity);
			System.out.println("content:" + content);
		} catch (Exception e) {
			e.printStackTrace();
		}			
	}	
	
	private List<NameValuePair> setHttpNameValues(Map<String,Object> paramMap) {
		List<NameValuePair> params = new ArrayList<NameValuePair>(); 
		for (Entry<String, Object> entry:paramMap.entrySet()){
			  params.add(new BasicNameValuePair(entry.getKey(),entry.getValue().toString()));  
		}
	  
		return params;
	}


	public static void main(String[] args) {
             //运用java工具类中线程池
		ExecutorService  pool = Executors.newCachedThreadPool();
		for (int i =0;i<2;i++) { //开启俩个线程
			String url = "xxxx";
			Map<String,Object> paramStr = getHttpParamStr();
			pool.execute(new ServiceThreadTest(url,paramStr));
		}
	}

	public  static Map<String,Object> getHttpParamStr() {
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("apiversion", 1);
		param.put("appversion", "3.6.2");
		return param;
	}
}

### Java 多线程HTTP 请求示例 为了实现多线程环境下的高效 HTTP 请求处理,可以采用 `PoolingHttpClientConnectionManager` 来管理连接池并控制并连接的数量。下面是一个基于 Apache HttpClient 的例子[^1]: ```java import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.apache.http.impl.nio.client.HttpAsyncClients; import org.apache.http.util.EntityUtils; import java.util.concurrent.Future; public class MultiThreadedHttpRequest { private static final int MAX_TOTAL_CONNECTIONS = 20; private static final int DEFAULT_MAX_PER_ROUTE = 5; public static void main(String[] args) throws Exception { // 创建连接池管理器 PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(MAX_TOTAL_CONNECTIONS); cm.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE); // 构建异步客户端实例 try (CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom() .setConnectionManager(cm) .build()) { httpclient.start(); // 起多个异步 GET 请求 Future<HttpResponse> future1 = httpclient.execute( new HttpGet("http://www.example.com/"), null); Future<HttpResponse> future2 = httpclient.execute( new HttpGet("http://www.apache.org/"), null); // 获取响应结果 HttpResponse response1 = future1.get(); System.out.println(response1.getStatusLine()); EntityUtils.consume(response1.getEntity()); HttpResponse response2 = future2.get(); System.out.println(response2.getStatusLine()); EntityUtils.consume(response2.getEntity()); } } } ``` 此代码片段展示了如何配置一个具有固定大小连接池的 HTTP 客户端,并通过创建两个不同的 URL 地址来模拟请求操作。 对于工作线程数量设置,在实际应用中可以根据具体需求调整最大总连接数 (`MAX_TOTAL_CONNECTIONS`) 和每路由的最大连接数 (`DEFAULT_MAX_PER_ROUTE`) 参数值[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值