同步调用、回调和异步调用区别

同步调用、回调和异步调用区别同步调用是以一种阻塞式调用比如说:古代的长城的烽火传递信息,现在我们假设每个烽火只能看到相邻的烽火状态,每个烽火的状态只有亮和暗。现在有A、B、C、D四个烽火,A首先点亮,B看到A的烽火亮了,立马去点火,花了2秒点亮。但是这时候负责C烽火的人在睡觉,可是这时候所有人都在等待C点亮,终于C睡了2个小时候看到了B点亮,然后去点亮。D由于长期没有点亮,导致烽火出现问题,因此整个过程都在等待D的完

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

同步调用是以一种阻塞式调用
比如说:古代的长城的烽火传递信息,现在我们假设每个烽火只能看到相邻的烽火状态,每个烽火的状态只有亮和暗。
现在有A、B、C、D四个烽火,A首先点亮,B看到A的烽火亮了,立马去点火,花了2秒点亮。但是这时候负责C烽火的人在睡觉,可是这时候所有人都在等待C点亮,终于C睡了2个小

时候看到了B点亮,然后去点亮。D由于长期没有点亮,导致烽火出现问题,因此整个过程都在等待D的完成。


伪代码:

if A complete
do B
else 
wait A

if B complete
do C
else
wait B

if C complete
do D 
else
wait C

这种就是典型的阻塞机制,无论如何我们只能等待上一个任务的完成,如果没有完成我们只能继续等待,这样造成的问题是,我们一直在浪费系统资源。

回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口

同样上面的例子:


现在我们还是A、B、C、D,但是A中有一个去B的信鸽(b),同样B中有(c),C中有(d)。现在我A收到消息后,我立马告诉信鸽b,然后自己去点亮烽火,信鸽会把信息带给B,B收
到信鸽信息后立马点亮,然后放信鸽去C,C看到B点亮后立马告诉信鸽,之后点亮烽火,然后才收到信鸽c返回的信息,最后D收到信鸽,点亮烽火。


大家应该看到了,有两种做法,一种是我可以先放信鸽(也就是先执行回调函数,然后在继续执行下面的代码),再点亮烽火。同样可以先点亮烽火再放信鸽。
伪代码:

if A Message
send to b 
do A

if B Message From b
do B
send to c

if B complete
send to D
do C
message from c

if Message From d
do D

这种就是在函数的参数中带有一个其他函数指针,当需要的时候我们可以通过函数指针名进行调用其他函数即发送消息到其他函数。

异步调用

异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。

依然是上面的例子:


现在我们有一个将臣F,他专门负责告诉每个烽火需要去点亮
A、B、C、D四个烽火,将臣先告诉了A,然后不等A点亮,他继续告诉了B、C和D。最后A在2小时后告诉了F我完成了,B在1小时后告诉了F我完成了,C在1.5小时后告诉F完成了,而D在3小时后告诉F完成了。F收到这些信息后,才知道整个过程完成了。

伪代码:

F tell A
  do A
  time 2 hours
  if A complete Report to F
F tell B
  do B
 time 1 hours
  if B complete Report to F
F tell C
  do C
 time 1.5 hours
  if C complete Report to F
F tell D
  do D
  time 3 hours
  if D complete Report to F

四个程序虽然有先后次序,但是四个烽火的点亮并不会依赖前面一个烽火是否点亮。也就是我们的代码执行虽然整体上看是依次执行的,但是执行的过程中,我们并不会因为前面的代码没有执行完,而不执行。

下面我我写三个例子,大家来看一下具体每个例子是什么调用方式。

例一:

var temp = false;


while(!temp){
  temp = wait(A.lightUp());
}


temp = false;


while(!temp){
  temp = wait(B.lightUp());
}
temp = false;


while(!temp){
  temp = wait(C.lightUp());
}
temp = false;


while(!temp){
  temp = wait(D.lightUp());
}

例二:

function lightUp(A, callback){
   callback();
   A.lightUp();
}


function callback(){
   B.lightUp();
}

例三:

A.lightUp(){
  this.do();
  this.onComplete(this.tell(F));
}

B.lightUp(){
  this.do();
  this.onComplete(this.tell(F));
}


C.lightUp(){
  this.do();
  this.onComplete(this.tell(F));
}

D.lightUp(){
  this.do();
  this.onComplete(this.tell(F));
}

上面三个例子大家可以自我去解答,我这里就不解答,如果想解答可以在评论说出,希望大家给出不通的理解和看法。也许我的只是个人臆想。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157488.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Location hash 属性

    Location hash 属性hash属性是一个可读可写的字符串,该字符串是URL的锚部分(从#号开始的部分)。实例返回一个URL的主要部分。假设当前的URL是http://www.runoob.com/test.htm#PART2document.write(location.hash);以上实例输出结果:#part2…

    2022年7月13日
  • mos双向电平转换电路_二极管电平转换电路

    mos双向电平转换电路_二极管电平转换电路电平转换电路在电路设计中会经常用到,市面上也有专用的电平转换芯片,专用的电平转换芯片主要是其转换速度较快,多使用在速度较高的通讯接口,一般对速度要求不高的控制电路,则可使用此文介绍的分立器件搭建的电平转换电路。1、NPN三极管下图使用NPN三极管搭建的电平转化电路属于单向的电平转换信号发生器:3.3V,10k,50%,方波注意事项:(1)该电路的信…

    2022年8月10日
  • influxdb原理与实战_fluent调用nist数据库

    influxdb原理与实战_fluent调用nist数据库本文属于《InfluxDB系列教程》文章系列,该系列共包括以下15部分:InfluxDB学习之InfluxDB的安装和简介InfluxDB学习之InfluxDB的基本概念InfluxDB学习

    2022年8月1日
  • 简单的说下nginx和apache的区别~~~[通俗易懂]

    简单的说下nginx和apache的区别~~~[通俗易懂]浅谈nginx和apache的优缺点~~~一、分别介绍nginx和apache1.nginx2.apache二、apache相对于nginx的优缺点1.优点2.缺点总结一、分别介绍nginx和apache1.nginx什么是nginx:Nginx是一个高性能的HTTP和反向代理服务器,同时还是IMAP/POP3/SMTP代理服务器,该程序由俄罗斯Rambler.ru站点开发,Nginx因为性能稳定、低系统资源消耗而闻名,近几年Nginx在国内已经成炙热化状态,比如像腾讯、网易、51CTO、迅雷、当当

    2022年5月29日
  • 安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a)[通俗易懂]

    安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a)[通俗易懂]背景Android系统本质是一个经过改造的Linux系统,so库是Linux系统上使用的共享库(类似windows上的dll)。最早,Android系统只支持ARMv5的CPU构架,随着Android系统的发展,又加入了ARMv7(2010),x86(2011),MIPS(2012),ARMv8,MIPS64和x86_64(2014)。每一种CPU构…

    2022年5月11日
  • ASP.NET和MSSQL高性能分页

    首先是存储过程,只取出我需要的那段数据,如果页数超过数据总数,自动返回最后一页的纪录:setANSI_NULLSONsetQUOTED_IDENTIFIERONGO–===========

    2021年12月20日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号