okHttpClient同步请求和异步请求的区别

2024-01-17 00:18

本文主要是介绍okHttpClient同步请求和异步请求的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OKhttp中请求任务的管理是由dispatcher来负责的,负责的请求的分发的发起,实际执行请求的是ConnectionPool

同步请求:同一时刻只能有一个任务发起,synchronized关键字锁住了整个代码,那么如果dangqianOKhttpClient已经执行了一个同步任务,如果这个任务没有释放锁,那么新发起的请求将被阻塞,直到当前任务释放锁,如下图源码:



@Override public Response execute() throws IOException {

//同一时刻只能有一个任务执行 因为是阻塞式的 由synchronized关键字锁住
    synchronized (this) {
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    captureCallStackTrace();
    try {
      client.dispatcher().executed(this);
      Response result = getResponseWithInterceptorChain();
      if (result == null) throw new IOException("Canceled");
      return result;
    } finally {
      client.dispatcher().finished(this);
    }

  }


异步请求:

同一时刻可以发起多个请求,以为异步请求每一个都是一个独立的线程,由两个队列管理,并且synchronized只锁住了代码校验是否执行的部分

@Override public void enqueue(Callback responseCallback)
synchronized ( this) {
if (executed) throw new IllegalStateException( "Already Executed"); 
executed = true; } //异步请求同一时刻可以有多个任务执行,由两个队列管理 
captureCallStackTrace(); 
client.dispatcher().enqueue( new AsyncCall(responseCallback)); 
}
        




 同步方式:发送请求后,就会进入阻塞状态,直到收到响应
OkHttpClient httpClient = new OkHttpClient.builder().readTimeout(5,TimeUnit.SECONDS).build();
                    Request request= new Request.Builder()
.url(www.baidu.com)
.get()
.build();

    

             Response  response=  httpClient.newCall(request).execute();

              String strBody =     response.body().string();

    上面的代码创建OkhttpClient 和Request对象,两者均使用了builder模式,然后将Request封装成Call对象,然后调用Call的

    execute()同步发送请求

异步方式:是在回调中处理响应的,

    OkHtrtpClient httpClient=new OkhttpClient.Builder().readTimeout(5,TimeUnit.SENCONDS).build();

    Request  request = new Request.Builder()

                                

.url(www.baidu.com)
.get()
.build();

            Call call=    httpClient.newCall(request);

            call.enqueue(new Callback(){

                    @Override

                public void onFailure(Call call, IOException e) {

                System.out.println("Fail");

            }

                @Override

                public void onResponse(Call call, Response response) throws IOException {

                System.out.println(response.body().string());

    

            })

同样是创建OkhttpClient,Request和Call,只是调用了enqueue方法,并在回调中处理响应。



这篇关于okHttpClient同步请求和异步请求的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/614377

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

python中json.dumps和json.dump区别

《python中json.dumps和json.dump区别》json.dumps将Python对象序列化为JSON字符串,json.dump直接将Python对象序列化写入文件,本文就来介绍一下两个... 目录1、json.dumps和json.dump的区别2、使用 json.dumps() 然后写入文

SpringBoot中Get请求和POST请求接收参数示例详解

《SpringBoot中Get请求和POST请求接收参数示例详解》文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServle... 目录1、Get请求1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

Nacos集群数据同步方式

《Nacos集群数据同步方式》文章主要介绍了Nacos集群中服务注册信息的同步机制,涉及到负责节点和非负责节点之间的数据同步过程,以及DistroProtocol协议在同步中的应用... 目录引言负责节点(发起同步)DistroProtocolDistroSyncChangeTask获取同步数据getDis

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M