链式操作
同步或异步
要同步链操作,通常一个接一个地编写语句,使用前面语句的结果来执行新语句:
// Build an animate action.
Animate animate = ...;
// Run the animate action synchronously.
animate.run();
// Build a listen action.
Listen listen = ...;
// Run the listen action synchronously.
listen.run();
在这里,我们运行一个 Animate 然后运行 Listen,此时均是同步的方式
这些操作也可以异步执行:
// Run the animate action asynchronously.
animate.async().run();
// Run the listen action asynchronously.
listen.async().run();
这些代码段执行异步操作,但它们没有链在一起:两个actions都将同时启动.
我们想要的是在个操作提供返回结果时执行第二个操作(这里是当动animation结束后listen).我们将在下面看到如何异步链接这些操作.
Futures
什么是一个 future
Future 包装异步操作的对象.
它允许您在顺序方式编写代码时执行异步操作.
Future 类主要是用于异步执行以下操作:
创建actions和资源等对象,
处理action执行(结果,取消和错误),
链一些action执行资源创建.
future的状态
一个Future 有3种状态:它可以提供结果,可以取消或者失败。这些状态对应于wrapped操作的不同*终状态.
如果一个wrapped操作:
返回一个值,Future 将在可用时提供此值,
被取消, Future将会被取消,
遇到错误, Future 将会失败.
Future是一个通用类, 这里的 T 是他能提供的值的类型. 比如 Future 能提供一个String 类型的值.
注意
如果wrapped的操作没有返回任何东西,那么future的类型就是 Future. 在这种情况下,如果操作成功Future则将以结果状态结束.
Future 类提供的get方法可以同步访问Future的值:
Future stringFuture = ...;
String value = stringFuture.get(); // Synchronous call to get the value.
调用get方法会阻塞当前线程:此调用是同步的.
提醒
同步调用Pepper机器人会阻塞,而异步调用则立即返回值.
如果在wrapped作中发生错误,get 调用将抛出一个 ExecutionException 如果操作被取消,则get 调用将抛出一个CancellationException.
使用一个try-catch 来确定Future 完成的状态:
Future stringFuture = ...;
try {
String value = stringFuture.get();
// The future finished with value.
} catch (ExecutionException e) {
// The future finished with error.
} catch (CancellationException e) {
// The future was cancelled.
}
更多资讯: 互动机器人 人机交互