您的位置:首页 > 理论基础 > 计算机网络

Apache HttpClient Fluent API:在后台线程中异步执行多个请求

2014-06-06 18:13 656 查看
完整代码:

package com.struts2.demo;

import org.apache.http.client.fluent.Async;
import org.apache.http.client.fluent.Content;
import org.apache.http.client.fluent.Request;
import org.apache.http.concurrent.FutureCallback;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
* 在后台线程中异步执行多个请求
* Created by Frank on 2014/6/6.
*/
public class FluentAsync {
public static void main(String[] args) {
Request[] requests = new Request[]{
Request.Get("http://www.baidu.com/"),
Request.Get("http://www.yahoo.com/"),
Request.Get("http://www.apache.com/"),
Request.Get("http://www.apple.com/")
};
Queue<Future<Content>> queue = new LinkedList<>();

/**
* 异步执行GET请求
*/
ExecutorService es = Executors.newFixedThreadPool(4);
Async async = Async.newInstance().use(es);
for (final Request request : requests) {
Future<Content> future = async.execute(request, new FutureCallback<Content>() {
@Override
public void completed(Content content) {
System.out.println(System.currentTimeMillis() + " Request completed: " + request);
}

@Override
public void failed(Exception e) {
System.out.println(e.getMessage() + ": " + request);
}

@Override
public void cancelled() {
System.out.println("Request cancelled: " + request);
}
});
queue.add(future);
}

Future<Content> future;
while ((future = queue.poll()) != null) {
if (future.isDone()) {
if (!future.isCancelled()) {
try {
future.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
future.cancel(true);
} catch (ExecutionException e) {
System.out.println(e.getMessage());
}
}
} else {
queue.add(future);
}
}
System.out.println("done");
es.shutdown();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  异步 线程