30-异步任务执行结果架构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84816915
  1. 异步任务执行结果架构
    1. 应用场景

在非阻塞模型中,通常需要根据异步的执行结果决定采取对应的操作。通过实现Callback接口,并用Future可以来接收多线程的执行结果。

    1. 示例:非线程池方式获取Future实例

通过实现Callable接口并重写call()方法(返回值为一个泛型对象),建立一个异步的回调对象call;使用call初始化一个FutureTask对象 ft,并初始化/启动异步任务;通过ft.get获取异步的执行结果。

 

    1. 类关系图

    1. Future  异步计算结果

它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。

      1. 常用方法
        1. boolean cancel(boolean t) 尝试取消正在运行的任务

如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则返回false。

当调用 cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。

        1. boolean isCancelled() 判断任务是否是在完成前被取消
        2. boolean isDone() 判断任务是否已完成(含异常/取消而完成)
        3. V get() 获取异步执行结果

   抛出:

        CancellationException - 如果计算被取消

        ExecutionException - 如果计算抛出异常

        InterruptedException - 如果当前的线程在等待时被中断

        1. V get(long timeout,TimeUnit unit) 等待时间内获取异步执行结果

        TimeoutException - 如果等待超时

    1. RunnableFuture

接口同时继承Future接口和Runnable接口;在成功执行run()方法后,可以通过Future访问执行结果。

    1. FutureTask 可取消的异步计算

查询异步计算是否完成,获取异步计算结果;

如果异步计算没有完成,get()则阻塞;当计算完成后,该异步操作不能重启和取消,除非调用runAndReset方法。

 FutureTask能用来包装一个Callable或Runnable对象,因为它实现了Runnable接口,而且它能被传递到Executor进行执行。

为了提供单例类,这个类在创建自定义的工作类时提供了protected构造函数。

      1. 构造方法
        1. FutureTask(Callable<V> callable)

创建一个 FutureTask,一旦运行就执行给定的 Callable。

        1. FutureTask(Runnable runnable, V result)

 创建一个 FutureTask,一旦运行就执行给定的 Runnable,并安排成功完成时 get 返回给定的结果 。

        1. 由于FutureTask实现了Runnable接口,可start()方式启动线程
    1. 获取Future对象
      1. 线程池中submit() ,execute()方式启动的线程
      2. 通过new FutureTask(Callable/Runnable)方式获取的Runnable实例,可start()方式启动

 

猜你喜欢

转载自blog.csdn.net/qq_38331606/article/details/84816915