2016-12-15 125 views
14

我知道这是一个相当开放的问题,我很抱歉。区别Await.ready和Await.result

我可以看到Await.ready返回Awaitable.typeAwait.result返回T但我仍然混淆他们。

两者有什么区别?

是一个阻塞和另一个非阻塞?

回答

16

它们都会阻塞,直到将来完成,差异只是它们的返回类型。

的区别是有用的,当你的Future抛出异常:

def a = Future { Thread.sleep(2000); 100 } 
def b = Future { Thread.sleep(2000); throw new NullPointerException } 

Await.ready(a, Duration.Inf) // Success(100) 
Await.ready(b, Duration.Inf) // Failure(java.lang.NullPointerException) 

Await.result(a, Duration.Inf) // 100 
Await.result(b, Duration.Inf) // crash with java.lang.NullPointerException 
1

一般来说,两者都是阻塞的。

区别在于Await.ready在给定时间内未完成(成功或失败)之前阻塞。

唯一一个区别是,ready块直到Awaitable就绪且result确实产生的结果类型T

Postscriptum: 在实践中,如果要执行类似错误检查一些动作或登录你会采取Await.ready(...)如果你想撰写的结果,并抛出一个错误,如果出现错误采取Await.result(...)

作为经验法则 - 尽量避免等待。