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 に答える