Retrofit2 并行请求

Raf*_*ima 6 multithreading retrofit okhttp retrofit2

我正在用来OkHttp + Retrofit2构建第三方系统的 api。
我注意到,即使使用一个ConnectionPool线程和多个线程,Retrofit 也不会同时进行调用。

这就是我创建服务的方式:

OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.connectionPool(new ConnectionPool(7, 1, TimeUnit.MINUTES););
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(10);
dispatcher.setMaxRequestsPerHost(10);
httpClientBuilder.dispatcher(dispatcher);
OkHttpClient okhttp = httpClientBuilder.build();
this.service = new Retrofit.Builder().baseUrl(API_URL).addConverterFactory(GsonConverterFactory.create(getGson())).client(okhttp).build().create(IService.class);
Run Code Online (Sandbox Code Playgroud)

为了简化 IService.class,假设它只有 2 个方法:

@GET
    Call<JsonElement> get(@Url String url, @HeaderMap Map<String, Object> headers, @QueryMap Map<String, Object> query);

        @POST
    Call<ResponseBody> complexPost(@Url String url, @HeaderMap Map<String, Object> headers, @QueryMap Map<String, Object> query, @Body RequestBody body);
Run Code Online (Sandbox Code Playgroud)

现在这就是我尝试发出并行请求的方式:

public static void main(String[] args) {

    final Map<String,Object> empty = new HashMap<String, Object>();
        new Thread(new Runnable() {

            @Override
            public void run() {
                    while(true) {
                        System.out.println("sending short request");
                        this.service.get(bar,empty,empty).execute();
                        System.out.println("short request sent");
                    }
            }
        }).start();


        new Thread(new Runnable() {

            @Override
            public void run() {
                byte[] buffer  = new byte[1024*1024];

                    while(true) {
                        RequestBody requestFile = RequestBody.create(MediaType.parse("application/octet-stream"), buffer, 0, buffer.length);
                        System.out.println("sending long request");
                        this.service.complexPost(foo, empty, empty, requestFile).execute();
                        System.out.println("long request sent");
                    }
            }
        }).start();

}
Run Code Online (Sandbox Code Playgroud)

简单解释:两个线程,线程A发送一个小的GET请求-线程B发送1MB数据请求[1024*1024零而已]

所以,没有什么是同步的,我有一个连接池,有足够的空闲连接来使其并行运行,在我看来,正弦请求 B 较大是很自然的,它需要很长时间才能完成请求,但由于没有同步,所以应该每个“发送的长请求”都会有很多“发送的短请求”。

但打印出来的内容是这样的:

sending short request
short request sent  
sending long request
long request sent
sending short request
short request sent
sending long request
long request sent
sending short request
short request sent
Run Code Online (Sandbox Code Playgroud)

没有线程正在中断其他请求。为什么????如何并行发出多个请求?