HttpClient4.x 多线程请求
来源:互联网 发布:淘宝客服的个人介绍 编辑:程序博客网 时间:2024/05/20 20:43
基本过程:使用httpclient发起多线程的请求,将返回的数据临时放在ArrayBlockingQueue中,单独开启一个线程读取ArrayBlockingQueue中的数据并写入磁盘上的文件。
启动请求线程import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;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;public class MultiReq {
//数据返回是否完毕标志位public static volatile int status =0;public static BlockingQueue<String> bqueue = new ArrayBlockingQueue<String>(1000);static ExecutorService exec = Executors.newCachedThreadPool();private static String[] urls = {};public void req() {PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
//最大线程数cm.setMaxTotal(140);CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();for(int i=0,n=urls.length;i<n;i++){HttpGet httpget = new HttpGet(urls[i]);exec.execute(new GetThread(httpClient,httpget));}}public static void main(String[] args){MultiReq req = new MultiReq();MultiReq.exec.execute(new getData());req.req();}}
发起请求的线程
package newreq;import java.io.IOException;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import org.apache.http.HttpEntity;import org.apache.http.HttpStatus;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.protocol.HttpClientContext;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.protocol.HttpContext;import org.apache.http.util.EntityUtils;public class GetThread implements Runnable{ private final CloseableHttpClient httpClient; private final HttpContext context; private final HttpGet httpget; public GetThread(CloseableHttpClient httpClient, HttpGet httpget) { this.httpClient = httpClient; this.context = HttpClientContext.create(); this.httpget = httpget; }@Overridepublic void run(){try { CloseableHttpResponse response = httpClient.execute( httpget, context); try { HttpEntity entity = response.getEntity(); String res = EntityUtils.toString(entity); if(!"[]".equals(res)){ MultiReq.bqueue.add(res); } if(MultiReq.status==0){ if(response.getStatusLine().getStatusCode()!=HttpStatus.SC_OK || entity==null || "[]".equals(res)){ synchronized(httpClient){ MultiReq.status=1; } } } } finally { response.close(); } } catch (ClientProtocolException ex) { // Handle protocol errors } catch (IOException ex) { // Handle I/O errors }}}处理返回的数据
import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;public class getData implements Runnable{);private static BufferedWriter bw = null;static{try {bw =new BufferedWriter(new FileWriter("D:\\file\\0723.txt"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run(){while(true){if (MultiReq.bqueue.size() > 0 && MultiReq.status == 0) {String readed = MultiReq.bqueue.poll();bw.write(readed); bw.flush();}}}}
0 0
- HttpClient4.x 多线程请求
- httpclient4.x代理请求
- HttpClient4.3.x请求https的解决方案
- httpclient4.x处理https协议请求
- 用httpclient4.x 发送http get post请求。
- 用httpclient4.x 发送http get post请求。
- httpclient4.3.x模拟post及get请求
- httpclient4.x 使用连接池发送https请求使用总结
- 使用Apache HttpClient4.x 发送 GET POST 请求
- httpclient4.x 使用连接池发送https请求
- HttpClient4.X发送带参数的POST请求
- HttpClient4.X发送带参数的Get请求
- httpclient4.X 设置代理请求(包含账号密码)
- httpclient4.X 设置代理请求(包含账号密码)
- HttpClient4.X 解决POST请求返回重定向问题
- HttpClient4.X发送带参数的Get请求
- HttpClient4.3.3 https请求
- httpClient4.x 爬虫教学
- ubuntu清除已卸载软件的配置文件
- Maximum Gap
- myeclipse10 实现JSF远程EJB3接口
- Android复制粘贴功能
- 阿里巴巴2013年校招试题单选解析
- HttpClient4.x 多线程请求
- 获取文件的流
- Android之ContentProvider详解
- 结解
- 使用Chrome开发者工具注入Javascript实现额外功能
- viewpage详解,四大函数
- 网页与HTML语言
- C语言实现随即梯度下降,批量梯度下降法
- 用两个栈实现队列