- 异步任务执行结果架构
- 应用场景
在非阻塞模型中,通常需要根据异步的执行结果决定采取对应的操作。通过实现Callback接口,并用Future可以来接收多线程的执行结果。
-
- 示例:非线程池方式获取Future实例
通过实现Callable接口并重写call()方法(返回值为一个泛型对象),建立一个异步的回调对象call;使用call初始化一个FutureTask对象 ft,并初始化/启动异步任务;通过ft.get获取异步的执行结果。
-
- 类关系图
-
- Future 异步计算结果
它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。
-
-
- 常用方法
- boolean cancel(boolean t) 尝试取消正在运行的任务
- 常用方法
-
如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则返回false。
当调用 cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。
-
-
-
- boolean isCancelled() 判断任务是否是在完成前被取消
- boolean isDone() 判断任务是否已完成(含异常/取消而完成)
- V get() 获取异步执行结果
-
-
抛出:
CancellationException - 如果计算被取消
ExecutionException - 如果计算抛出异常
InterruptedException - 如果当前的线程在等待时被中断
-
-
-
- V get(long timeout,TimeUnit unit) 等待时间内获取异步执行结果
-
-
TimeoutException - 如果等待超时
-
- RunnableFuture
接口同时继承Future接口和Runnable接口;在成功执行run()方法后,可以通过Future访问执行结果。
-
- FutureTask 可取消的异步计算
查询异步计算是否完成,获取异步计算结果;
如果异步计算没有完成,get()则阻塞;当计算完成后,该异步操作不能重启和取消,除非调用runAndReset方法。
FutureTask能用来包装一个Callable或Runnable对象,因为它实现了Runnable接口,而且它能被传递到Executor进行执行。
为了提供单例类,这个类在创建自定义的工作类时提供了protected构造函数。
-
-
- 构造方法
- FutureTask(Callable<V> callable)
- 构造方法
-
创建一个 FutureTask,一旦运行就执行给定的 Callable。
-
-
-
- FutureTask(Runnable runnable, V result)
-
-
创建一个 FutureTask,一旦运行就执行给定的 Runnable,并安排成功完成时 get 返回给定的结果 。
-
-
-
- 由于FutureTask实现了Runnable接口,可start()方式启动线程
-
- 获取Future对象
- 线程池中submit() ,execute()方式启动的线程
- 通过new FutureTask(Callable/Runnable)方式获取的Runnable实例,可start()方式启动
-