同步:一个任务A的完成需要依赖另一个任务B,只有任务B完成之后,任务A才算是完成任务。
异步:一个任务A需要依赖任务B,任务A只是通知任务B要完成什么样的工作,任务B立马执行,而与此同时任务A已经算是完成整个任务了。当B完成任务时,通知任务A,表明任务B已经完成任务了。
同步和异步应用在IO操作上,有一下这么几种组合:同步阻塞+异步非阻塞+同步非阻塞。接下来就上述三种组合搭配图例进行描述。
-
同步阻塞
阻塞:用户线程在调用业务处理组件时,可能业务处理组件非常耗时,因此在此期间用户线程什么都不能干,必须等待。因此用户线程处于等待状态。
同步:用户线程一直等待业务组件处理业务完成,直到业务组件完成之后,用户线程才能返回。
-
同步非阻塞
非阻塞:用户线程在调用业务组件处理业务的时候,它通知完业务组件就直接返回,而此时用户线程可以不必等待业务组件处理耗时的业务处理,可以处理其他的业务。
同步:用户线程在处理其他业务的同时,依旧启动一个线程不断的轮询业务组件是否完成了耗时的业务处理。如果用户线程轮询到业务处理完毕,则意味着用户线程完成此次业务处理。
-
异步非阻塞
非阻塞:用户线程在通知完业务组件处理业务之后,立即返回。而不再等待业务组件的处理,去处理其他的业务。
异步:用户线程在调用业务组件之后,只是通知业务组件,然后直接返回。耗时的业务组件是否什么时候开始,处理什么业务都和用户线程无关。等待业务组件耗时的操作完成之后,业务组件会通知用户线程。
-
异步回调函数
业务组件完成业务之后如何通知用户程序?
用户得到通知,即用户自定义了一个方法,这个方法得到调用,使得用户感知到。
例如:业务组件是为了从数据库(io)中读取相应的数据,封装成java对象。而在读取完毕数据之后,处理完毕业务之后,会通知用户程序已经处理完毕,而用户程序负责将这些数据转化成json格式,渲染到前端页面。
这就涉及到回调函数。
用户程序通知业务组件去处理业务逻辑,立即返回,用户程序并不知道业务组件什么时候完成业务处理,但是用户程序需要将业务处理的结果进行下一步的处理。
因此,可以将这个处理封装成一个函数,在通知业务组件的处理业务的时候,传递给业务组件。
意思是:等你处理完业务之后,要调用我传递给你的这个函数,这个函数的目的是,将你返回的数据转化成json格式,渲染到前端页面。这就是所谓的回调,本来用户程序已经返回,结果业务处理完成之后,又回调用户程序的函数。