查看Java库AsyncHttpClient中的代码块,客户端启动一个新线程(Future
)来发出请求。回调是否会发生在同一个线程上,还是会在“主”线程上运行(在这种情况下,是调用new AsyncHttpClient()
的线程?
import com.ning.http.client.*;
import java.util.concurrent.Future;
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
asyncHttpClient.prepareGet("http://www.ning.com/ ").execute(new AsyncCompletionHandler<Response>(){
@Override
public Response onCompleted(Response response) throws Exception{
// Do something with the Response
// ...
return response;
}
@Override
public void onThrowable(Throwable t){
// Something wrong happened.
}
});
答案 0 :(得分:3)
客户端启动一个新线程(
Future
)来发出请求。
不。 Future
基本上意味着:此方法已经返回,但尚未完成处理。处理将在后台继续(在您无法控制的其他一些线程中),并将在 future 中完成一段时间。您可以询问此Future
对象以查看未来是否已经到来(处理已完成)。你自己不是在创建任何线程。
想想ExecutorService
。您正在提交要完成的任务并等待结果。但是,您可以获得Future
而不是阻止,只要您提交的任务到达线程池并进行处理,就会立即返回结果。
回调是否会发生在同一个线程上,还是会在“主”线程上运行
都不是。在响应返回时,您的线程(调用AsyncHttpClient.execute()
的线程)最有可能做出完全不同的事情。也许它服务于另一个客户或已经死了。您不能代表某些线程调用任意代码。
实际上,这段代码将由AsyncHttpClient库创建的内部NIO线程执行。你绝对无法控制这个线程。但您必须记住,这将异步发生,因此如果您访问全局对象,则可能需要同步或某些锁定。
答案 1 :(得分:2)
你可以通过那段代码检查:
import java.io.IOException;
import com.ning.http.client.AsyncCompletionHandler;
import com.ning.http.client.AsyncHttpClient;
import com.ning.http.client.Response;
public class Asink {
public static void main(String... args) throws IOException {
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
asyncHttpClient.prepareGet("http://www.google.com/").execute(
new AsyncCompletionHandler<Response>() {
@Override
public Response onCompleted(Response response)
throws Exception {
// Do something with the Response
// ...
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
return response;
}
@Override
public void onThrowable(Throwable t) {
// Something wrong happened.
}
});
}
}