`

线程请求执行,一个多线程程执行HTTP请求的例子。

    博客分类:
  • java
 
阅读更多
package cn.lake.util;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.util.EntityUtils;

/**
 * An example that performs GETs from multiple threads.
 * 
 * @author Michael Becke
 */
public class ClientMultiThreadedExecution {

	public static void main(String[] args) throws Exception {
		// Create and initialize HTTP parameters
		HttpParams params = new BasicHttpParams();
		ConnManagerParams.setMaxTotalConnections(params, 100);
		HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

		// Create and initialize scheme registry 
		SchemeRegistry schemeRegistry = new SchemeRegistry();
		schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
		schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

		// Create an HttpClient with the ThreadSafeClientConnManager.
		// This connection manager must be used if more than one thread will
		// be using the HttpClient.
		ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
		HttpClient httpClient = new DefaultHttpClient(cm, params);

		// create an array of URIs to perform GETs on
		String[] urisToGet = { "http://jakarta.apache.org/", "http://jakarta.apache.org/commons/",
				"http://jakarta.apache.org/commons/httpclient/", "http://svn.apache.org/viewvc/jakarta/httpcomponents/" };

		// create a thread for each URI
		GetThread[] threads = new GetThread[urisToGet.length];
		for (int i = 0; i < threads.length; i++) {
			HttpGet httpget = new HttpGet(urisToGet[i]);
			threads[i] = new GetThread(httpClient, httpget, i + 1);
		}

		// start the threads
		for (int j = 0; j < threads.length; j++) {
			threads[j].start();
		}

	}

	/**
	 * A thread that performs a GET.
	 */
	static class GetThread extends Thread {

		private final HttpClient httpClient;
		private final HttpContext context;
		private final HttpGet httpget;
		private final int id;

		public GetThread(HttpClient httpClient, HttpGet httpget, int id) {
			this.httpClient = httpClient;
			this.context = new BasicHttpContext();
			this.httpget = httpget;
			this.id = id;
		}

		/**
		 * Executes the GetMethod and prints some status information.
		 */
		@Override
		public void run() {

			System.out.println(id + " - about to get something from " + httpget.getURI());

			try {

				// execute the method
				HttpResponse response = httpClient.execute(httpget, context);

				System.out.println(id + " - get executed");
				// get the response body as an array of bytes
				HttpEntity entity = response.getEntity();
				if (entity != null) {
					byte[] bytes = EntityUtils.toByteArray(entity);
					System.out.println(id + " - " + bytes.length + " bytes read");
				}

			} catch (Exception e) {
				httpget.abort();
				System.out.println(id + " - error: " + e);
			}
		}

	}

}

 有技术兴趣的 请加28830308群.

分享到:
评论

相关推荐

    基于多线程和gdal类库的影像读写

    在IT领域,尤其是在地理信息系统(GIS)开发中,"基于多线程和gdal类库的影像读写"是一个关键的技术点。GDAL(Geospatial Data Abstraction Library)是一个强大的开源库,用于处理多种遥感和地图数据格式,包括TIFF...

    Java多线程程经典案例.doc

    Java多线程程经典案例.doc

    使用RandomAccessFie分段写大文件,创建多线程程席、通讨多线程分段读取大文件并分段写入到新文件

    每个线程可以独立处理文件的一个分段,这样就可以并发地执行读写操作,大大提高处理速度。创建线程的基本步骤包括定义线程类,重写`run()`方法,然后实例化线程并调用`start()`方法。 接下来,我们详细讨论如何实现...

    多线程产生Fibonacci序列

    很小的程序,运行程序时开子线程运算Fibonacci序列,父线程输出

    Delegate方式的异步线程程学习Dome

    BeginInvoke方法启动一个异步操作,它不会等待操作完成就立即返回,而是立即返回一个IAsyncResult对象,可以用于后续跟踪操作状态。EndInvoke方法则用于在操作完成后获取结果或异常。例如: ```csharp public ...

    linux c++ socket 多线程2

    第二套:c语言Socket编程C语言SOCKET编程指南.c语言多进程多线程程.pdf,Linux Socket rogramming by Example.pdf,Linux 多线程等10多个资料....

    C++程程设计

    5. **多线程**:如果系统需要同时处理多个任务,如并发的选课请求,可能需要利用C++的多线程支持,如std::thread库。 6. **文件I/O操作**:用于保存和加载配置文件或日志,可能需要使用C++的文件流(fstream)进行...

    本程程源码

    【标题】: "本程程源码" 指的是一种编程项目,通常是指一个包含所有源代码的软件开发工程。在IT行业中,源码是程序员编写的应用程序或系统的基础,它是由人类可读的编程语言编写的。通过源码,开发者可以直接理解并...

    Java中的多线程编程

    进程是一个具有独立功能的程序,关于某个特定数据集合进行的一次运行活动。   进程是系统进行资源分配和调度运行的基本单位(程序 + 数据 + 进程控制块PCB),进程会独占CPU。   线程是进程基础上的进一步划分,可...

    一个比较好电梯模拟程序 c++程程设计

    电梯模拟程序是一个经典的计算机科学问题,常常用于教授和实践面向对象编程的概念。在这个项目中,我们将探讨如何使用C++设计一个高效、灵活的电梯模拟系统。C++是一种强大的编程语言,支持面向对象编程,能够帮助...

    java袁程程

    在Java编程语言中,"java袁程程"可能是一个课程或者个人学习计划的名称,重点关注的是多态性(Polymorphism)和封装(Encapsulation),这两个是面向对象编程(Object-Oriented Programming, OOP)的基石。...

    Scala并发编程程.rar

    Scala并发编程是高级函数式编程语言Scala中的一个重要领域,它涉及到如何在多核心处理器系统上高效、安全地执行任务。Scala提供了丰富的并发工具和模型,使得开发者能够在编写高性能、可扩展的应用程序时,同时保持...

    多线程读取+多进程保存多路摄像头图像

    (1)利用python多进程程或多线程实时读取远程IP摄像头视频 (2)Pyhon cv2.VideoWriter 保存视频 整合成如下代码,可以对多路网络摄像头图像实时采集并分别保存视频。或者自己改写代码,直接保存每路的实时图像也...

    程程电子 单片机 CCDZ-C原理图

    程程电子单片机CCDZ-C原理图展示了一个典型的基于89C52微控制器的电子系统设计。该系统不仅具备基本的控制功能,还集成了多种外围设备,如数码管显示、数模转换、模数转换等功能,适用于各种实际应用场合。通过对该...

    多进程同步解决生产者消费者问题(c++源码)

    1. **动态显示缓冲区状态**:每当一个生产者或者消费者完成对缓冲区的操作时,程序应即时显示缓冲区的所有内容、当前指针的位置以及执行操作的进程标识符。 2. **多生产者与多消费者**:系统中至少包含两个以上的...

    查找进程并关闭进程程提升到system隐藏近在眼前

    `Process32First`用于获取快照中的第一个进程信息,然后`Process32Next`可以获取下一个进程的信息,直到遍历完所有进程。 3. **CloseHandle**:当不再需要进程快照时,我们需要调用`CloseHandle`来释放资源。这个...

    python实现生产者消费者并发模型

    多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、队列(Queue)、事件(Event)、管道(Pipe) ,并辅之(共享内存、Manager) 不同计算机之间实现生产者消费者模型:socket、远程调用(RPC...

    进程程调度和页面转换实验.rar

    在多任务操作系统中,进程调度是决定哪个进程应该获取CPU执行权的关键机制。它主要分为三种类型:抢占式调度、非抢占式调度和混合式调度。在抢占式调度中,高优先级的进程可以中断当前正在执行的进程;非抢占式调度...

    学生竞赛评价系统

    "学生竞赛评价系统"是一个基于C语言开发的项目,旨在为教育机构或竞赛组织者提供一个平台,用于管理和评估学生的比赛表现。这个项目可能是大学C语言课程的一个实践环节,旨在帮助学生将课堂所学理论知识转化为实际...

    杯口基础模板程程施工设计方案.pdf

    杯口基础模板程程施工设计方案.pdf

Global site tag (gtag.js) - Google Analytics