完整代码:
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();
}
}