java.util.concurrent中主要包括三类工具,Executor Freamework,并发集合(Concurrent Collection),以及同步器(Synchronizer)。
Future接口表示异步计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。
public class AsyncClientHttpExchange { public static void main(final String[] args) throws Exception { // 默认的配置 CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault(); try { httpclient.start(); HttpGet request = new HttpGet("http://www.apache.org/"); Future<HttpResponse> future = httpclient.execute(request, null); // 获取结果 HttpResponse response = future.get(); System.out.println("Response: " + response.getStatusLine()); System.out.println("Shutting down"); } finally { httpclient.close(); } System.out.println("Done"); } }
同步器(Synchronizer)是一些使线程能够等待另一个线程的对象,允许它们协作。
最常用的同步器是CountDownLatch和Semaphore。较不常用的是CyclicBarrier和Exchanger。Semaphore类是一个计数信号量。计数信号量由一个指定数量的 "许可" 初始化。每调用一次 acquire(),一个许可会被调用线程取走。每调用一次 release(),一个许可会被返还给信号量。因此,在没有任何 release() 调用时,最多有 N 个线程能够通过 acquire() 方法,N 是该信号量初始化时的许可的指定数量。这些许可只是一个简单的计数器。
CountDownLatch是一个同步辅助类,以一个给定的数量初始化。countDown() 每被调用一次,这一数量就减一。通过调用 await() 方法之一,线程可以阻塞等待这一数量到达零。
下面是异步请求一组url的例子,利用callback借口完成独立的操作。
public class AsyncClientHttpExchangeFutureCallback { public static void main(final String[] args) throws Exception { RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(3000).setConnectTimeout(3000).build(); CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom() .setDefaultRequestConfig(requestConfig).build(); try { httpclient.start(); final HttpGet[] requests = new HttpGet[] { new HttpGet("http://www.apache.org/"), new HttpGet("https://www.verisign.com/"), new HttpGet("http://www.google.com/"), new HttpGet("http://www.baidu.com/") }; final CountDownLatch latch = new CountDownLatch(requests.length); for (final HttpGet request : requests) { httpclient.execute(request, new FutureCallback<HttpResponse>() { // 无论完成还是失败都调用countDown() @Override public void completed(final HttpResponse response) { latch.countDown(); try { String content = EntityUtils.toString(response.getEntity, "UFT-8"); System.out.println("response content is " + content); } catch (Exception e) { e.printStackTrace(); } System.out.println(request.getRequestLine() + "->" + response.getStatusLine()); } @Override public void failed(final Exception ex) { latch.countDown(); System.out.println(request.getRequestLine() + "->" + ex); } @Override public void cancelled() { latch.countDown(); System.out.println(request.getRequestLine() + " cancelled"); } }); } latch.await(); System.out.println("Shutting down"); } finally { httpclient.close(); } System.out.println("Done"); } }
http://www.linuxidc.com/Linux/2014-09/106563.htm
相关推荐
Java中的HTTP异步请求是一种高效的网络通信方式,它允许程序在发送HTTP请求后不等待响应,而是立即继续执行其他任务,当服务器响应时,通过回调函数处理结果。这种方式避免了同步请求时线程阻塞的问题,提高了应用的...
本篇文章将详细介绍如何使用Java的HttpClient实现异步请求资源。 首先,让我们了解什么是异步请求。在同步请求中,调用一个API或发送一个HTTP请求后,程序会等待响应返回,然后继续执行后续代码。而异步请求则不同...
HttpAsyncClient是Apache HttpClient项目的一部分,它是一个强大的Java库,用于执行HTTP请求,特别是强调异步非阻塞I/O操作。这个工具包被设计用来处理大量并发请求,这对于现代Web应用和服务来说非常重要,因为它们...
2. **异步请求**:HttpAsyncClient提供了多种方法来发起异步HTTP请求,如execute(HttpUriRequest)方法,它可以处理GET、POST等各种HTTP方法。请求执行后,你可以提供一个FutureCallback或者注册一个 HttpContext ...
《Java异步HTTP客户端开发详解——HttpAsyncClient》 在Java世界中,高效地处理HTTP请求是许多开发者面临的重要任务,尤其是对于需要处理大量并发请求的场景。Apache HttpClient项目为开发者提供了一个强大的工具,...
2. **异步处理**:库中的核心接口`org.apache.http.nio.client.HttpAsyncClient`定义了异步请求和响应处理方法,如`execute`和`start`。通过注册回调函数,开发者可以在请求完成或出现错误时得到通知,无需显式地...
- 发起异步请求,例如`execute(HttpUriRequest, FutureCallback)`。 - 关闭客户端时需调用`close()`方法释放资源。 6. **实例源码分析**:在"HttpAsyncClient.zip"中,包含的源码示例可能涵盖了以下主题: - ...
HttpAsyncClient就是这样一个专门针对异步HTTP请求设计的库,它允许开发者在Java环境中以非阻塞的方式发送HTTP请求,从而提高应用的性能和响应速度。 首先,我们需要理解什么是异步编程。在传统的同步模式中,程序...
测试内容应包括但不限于:正常请求、错误处理、超时设置、连接管理、异步请求等。 总结来说,利用Apache HttpClient进行Java后端的HTTP请求,需要依赖一系列Apache Commons库,这些库提供了从网络通信到数据处理的...
总结起来,httpasyncclient是一个强大的Java HTTP异步客户端库,通过非阻塞I/O和事件驱动模型,提高了网络应用的并发性能和响应速度。httpasyncclient-4.0-beta4.jar作为该库的一个版本,提供了完整的API和实现,为...
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> ... <artifactId>httpasyncclient</artifactId> <version>4.1.2</version> </dependency>
HttpAsyncClient是Apache HttpClient项目的一个子模块,专注于异步非阻塞的HTTP客户端操作。在Java世界中,它为开发者提供了强大的、高性能的HTTP/1.1和HTTP/2通信能力。HttpAsyncClient 4.1.1版本是对这个库的一次...
此外,HttpClient还支持异步操作,通过`HttpAsyncClient`可以实现非阻塞的网络I/O,这对于高并发的场景非常有用。 在博客中的"HttpHandler.java"文件很可能包含了实现这些功能的具体代码示例。它可能包括了请求的...
在给定的文件中,我们关注的是三个关键的JAR包:`httpasyncclient-4.0-beta4.jar`、`httpcore-4.3.2.jar`和`httpmime-4.3.5.jar`,它们共同构建了一个强大的异步HTTP处理框架。 1. **HttpAsyncClient 4.0-beta4**:...
HTTP 工具箱v0.1.0 2014-12-19用途列举了HttpClient的常用功能, 让我们可以快速上手完成发送HTTP请求的任务并发请求异步请求(HttpAsyncClient)解析JSON支持gzip常用的log4j配置常用的应用配置机制, 例如需要打包一个...
3. 使用`execute()`方法发起异步请求,传入`HttpRequest`、`HttpAsyncResponseConsumer`和`FutureCallback`。 4. `execute()`方法返回一个`Future`对象,可以通过它来检查请求状态或获取结果。 5. 在回调函数中处理...
在提供的压缩包中,可能还包含其他依赖,如`httpmime.jar`用于处理MIME类型的请求体,或者`httpasyncclient.jar`用于异步HTTP操作。 以下是一些使用Apache HttpClient的基本步骤: 1. **创建HttpClient实例**:...
HttpClient的异步特性是通过`HttpAsyncClient`实现的,它允许在不阻塞主线程的情况下发送HTTP请求。`Future<HttpResponse>`返回的结果可以异步处理,增强了程序的并发性能。 在学习HttpClient源码时,你可以深入...
9. **异步处理**:除了同步方式,HttpClient还提供了异步API,如`HttpAsyncClient`,可以在单独的线程中处理请求和响应,这对于非阻塞I/O和高并发场景特别有用。 10. **版本兼容性**:HttpClient有多个版本,不同...