AsyncHttpClient(Java)onComplete():onCompleted()是否在单独的线程上运行?

时间:2012-08-01 17:39:23

标签: java asynchttpclient

查看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.
    }
});

2 个答案:

答案 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.
                    }
                });
    }
}