3

查看 Java 库AsyncHttpClient中的代码块,客户端启动一个新线程 (a 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.
    }
});
4

2 回答 2

3

客户端启动一个新线程 (a Future) 来发出请求。

没有。基本的Future意思是:这个方法已经返回但是它还没有完成处理。处理将在后台继续(在您无法控制的其他线程中),并将在未来的某个时间完成。您可以询问该Future对象以查看未来是否已经到来(处理完成)。您自己没有创建任何线程。

想想ExecutorService。您正在提交一些要完成的任务并等待结果。但是,您不会阻塞,而是Future会在您提交的任务到达线程池并被处理后立即返回结果。

回调会发生在同一个线程上,还是会在“主”线程上运行

两者都不。当响应返回时,您的线程(调用的线程AsyncHttpClient.execute())很可能正在做一些完全不同的事情。也许它为另一个客户服务或者已经死了。您不能只代表某个线程调用任意代码。

实际上,这段代码将由 AsyncHttpClient 库创建的内部 NIO 线程执行。你完全无法控制这个线程。但是您必须记住,这将异步发生,因此如果您访问全局对象,可能需要同步或某些锁定。

于 2012-08-01T17:54:15.610 回答
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.
                    }
                });
    }
}
于 2012-08-01T17:54:04.643 回答