同步调用,异步回调和 Future 模式

目标

通过与方法的同步调用,异步回调比较,理解 Future 模式

三者的不同

让我们先来明确一下同步与异步的不同。我们这里所说的同步和异步,仅局限在方法的同步调用和异步回调中。即,同步指的是调用一个方法,调用方要等待该方法所执行的任务完全执行完毕,然后控制权回到调用方;异步指的是调用一个方法,调用方不等该方法执行的任务完毕就返回,当任务执行完毕时会自动执行调用方传入的一块代码。

同步调用

void runTask {
  doTask1()
  doTask2()
}

同步调用,执行完 doTask1 在执行 doTask2

异步回调

doTask1(new Callback() {
  void call() {
    doTask3()
  }
});
doTask2();

异步回调,会同时执行 doTask1 和 doTask2, 在执行完 doTask1 后执行 doTask3

Future 模式

Future future = doTask1();
doTask2();
doTask3();
Result result = future.get();

我们可以看到,Future 模式中,一个任务的启动和获取结果分成了两部分,启动执行是异步的,调用后立马返回,调用者可以继续做其他的任务,而等到其他任务做完,再获取Future的结果,此时调用 get 时是同步的,也就是说如果 doTask1 如果还没有做完,等它做完。

适用情景

我们根据前面的例子可以看出,同步调用适合执行耗时短的任务,异步回调适合执行耗时长的任务,而且调用它之后调用的任务没什么关系。

Future 则适合执行长得任务,而且它的结果可能与调用后执行的任务有关系。比如,在烧水的过程中洗刷水壶,最后两者都完了才能泡茶。

Future模式的 Java 实现

Java 的并发库实现了 Future 模式,它定义了 Future 接口:

public interface Future<V> {
    boolean cancel(boolean var1);

    boolean isCancelled();

    boolean isDone();

    V get() throws InterruptedException, ExecutionException;

    V get(long var1, TimeUnit var3) throws InterruptedException, ExecutionException, TimeoutException;
}

它未来将会产生我们所需要的结果。

我们通过它取消任务的执行,判断是否取消和是否完成,获取结果。

Java 库还实现了一个 FutureTask, 它实现了 RunnableFuture(它继承了 Runnable 和 Future)。于是我们就可以用 Executor 来执行这个任务了。

FutureTask<String> futureTask = new FutureTask<>(new Runnable() {
    @Override
    public void run() {

    }
}, "hello");
Executors.newSingleThreadExecutor().execute(futureTask);

... 其他任务

try {
    String result = futureTask.get();
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}

总结

  1. 同步调用,调用方掌握控制权
  2. 异步回调,调用方放权,从而可以实现并行处理任务
  3. Future 模式,则是控制权和平行处理的折中

原文地址:http://blog.51cto.com/13616847/2073737

时间: 2024-10-10 01:59:50

同步调用,异步回调和 Future 模式的相关文章

C# 委托的三种调用示例(同步调用 异步调用 异步回调)

本文将主要通过同步调用.异步调用.异步回调三个示例来讲解在用委托执行同一个加法类的时候的的区别和利弊 首先,通过代码定义一个委托和下面三个示例将要调用的方法: public delegate int AddHandler(int a,int b); public class 加法类 { public static int Add(int a, int b) { Console.WriteLine("开始计算:" + a + "+" + b); Thread.Slee

C# 同步调用 异步调用 异步回调 多线程的作用

同步调用   : 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 异步调用  :同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了.异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行.委托的异步调用通过BeginInvoke和EndInvoke来实现. 异步回调函数  :当异步调用时,主线程并没有等待,而是

同步调用和异步调用

同步调用 异步调用 是把pool.submit()这个对象当作参数给weigh,所以weigh里面要shit = shit.result() 同步调用是,进行一个任务,先完成,再开始一个任务(alex拉完,再到egon拉) 异步调用是来一个拉一个,回调指的是add_done_callback(函数名) 同步调用和阻塞无关,因为他只是在等待,并没有I/O的操作 原文地址:https://www.cnblogs.com/FlFtFw/p/9519045.html

同步、异步、阻塞、非阻塞的概念理解

  网络通信中的同步和异步机制描述通信模式.同步机制,是指发送方发送请求后,需要等待接收到接收方发回的响应之后,才开始发送下一个请求:异步机制,正好相反,是指发送方在发送一个请求之后,不等待接收方响应这个请求就继续发送写一个请求.所有来自发送方的请求将形成一个队列,接收方处理完请求之后通知发送方. 而阻塞和非阻塞是用来描述进程的处理调用的方式,实际上也就是网络套接字Socket的阻塞和非阻塞方式,而Socket的实质也就是IO操作.Socket的阻塞调用方式为,在调用IO结果返回之前,当前线程从

java future模式 所线程实现异步调用(转载

java future模式 所线程实现异步调用(转载) 在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决.Future顾名思意,有点像期货市场的“期权”,是“对未来的一种凭证”,例如当我们买了某个房地产开发商的期房,交钱之后,开发商会给我们一个凭证(期权),这个凭证告诉我们等明年某个时候拿这个凭证就可以拿到我们所需要的房子,但是现在房子还没建好.市场上之所以有“期货”,也正由于有这种需求,才有这种供给. 这种应用在GUI上用的比较多,在设

多线程异步调用之Future模式

一.什么是异步调用 当我们调用一个函数的时候,如果这个函数的执行过程是很耗时的,我们就必须要等待,但是我们有时候并不急着要这个函数返回的结果.因此,我们可以让被调者立即返回,让他在后台慢慢的处理这个请求.对于调用者来说,则可以先处理一些其他事情,在真正需要数据的时候再去尝试获得需要的数据(这个真正需要数据的位置也就是上文提到的阻塞点).这也是Future模式的核心思想:异步调用. 到了这里,你可能会想CountDownLatch不是也可以实现类似的功能的吗?也是可以让耗时的任务通过子线程的方式去

详解回调函数——以JS为例解读异步、回调和EventLoop

转自:http://blog.csdn.net/tywinstark/article/details/48447135#comments 很多人在问什么是回调?百度出来的答案基本都不正确,看了只会让人更加迷惑.下文试着用尽量简单的例子帮大家梳理清楚,因为回调并不是一句话下定义就能明白的概念,需要用一段文字像讲故事一样来说明,回调如同很多重要的计算机概念一样,它是有历史文化的,你需要知道它从哪里来,用来干什么,才能理解及在实际生产中应用. 回调,是非常基本的概念,尤其在现今NodeJS诞生与蓬勃发

半同步/半异步并发模式进程池实现

半同步/半异步并发模式:父进程监听到新的客户端连接请求后,以通信管道通知进程池中的某一子进程:"嘿,有新的客户连接来了,你去accept,然后处理下!",从而避免在进程间传递文件描述符.这种模式中,一个客户连接上的所有任务始终有同一个进程来处理. 具体细节,尽在代码中: #ifndef PROCESSPOOL_H #define PROCESSPOOL_H #include <sys/types.h> #include <sys/socket.h> #inclu

同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事.   例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个