Comment OkHttp effectue-t-il des requêtes HTTP parallèles avec des connexions HTTP apparemment synchrones, sans l'utilisation de threads?

J'ai fait quelques tests de performance avec le OkHttp de la bibliothèque et l'a trouvé pour être grand. Il n'a de 80 demandes de http://httpbin.org/delay/1qui délibérément pause de 1 seconde pour chaque demande, en 4.7 s sur mon HTC One téléphone. J'ai regardé le code et je vais essayer de trouver pourquoi il est si rapide. Les développeurs de forme Carrée (Inc) annoncent le Regroupement de connexions et d'appels Asynchrones, les deux qui, je crois, de contribuer à la bonne performance.

Je viens de la .Monde NET et dans les .NET 4.5, vous avez un vrai async HTTP bibliothèque avec un Async GetResponse-méthode. En cédant le fil de l'OS lors de l'attente de la réponse, vous libérer des ressources afin de lancer plusieurs requêtes HTTP, ou d'autres choses. Le truc c'est que je ne peut pas voir le même schéma avec OkHttp (ou tout autre HTTP bibliothèque pour Android j'ai regardé dans). Alors, comment puis-je exécuter toujours 80 1 seconde demande dans les 4 secondes? Il n'est pas basé sur le thread, non? Je ne suis pas de tir jusqu'à 80 (ou 20) les threads?

Pour être plus précis, dans com.squareup.okhttp.Appel.beginRequest()je vois pas céder du fil entre le sendRequest et getResponse appels:

if (canceled) return null;

try {
    engine.sendRequest();

    if (request.body() != null) {
        BufferedSink sink = engine.getBufferedRequestBody();
        request.body().writeTo(sink);
    }

    engine.readResponse();
} catch (IOException e) {
    HttpEngine retryEngine = engine.recover(e, null);
    if (retryEngine != null) {
        engine = retryEngine;
        continue;
    }

    //Give up; recovery is not possible.
    throw e;
}

Response response = engine.getResponse();

Donc encore une fois, comment faire 80 "parallèle" des appels possible?

Je n'ai pas besoin de savoir afin d'utiliser la bibliothèque, mais de programmation asynchrone m'intéresse et j'aimerais vraiment comprendre comment OkHttp/SquareInc a réglé ce problème.

source d'informationauteur Nilzor