2016-12-15 6 views
14

これはかなりオープンな質問であり、私はお詫び申し上げます。差異Await.readyとAwait.result

私はそのAwait.ready戻りAwaitable.typeAwait.resultしばらく戻っTを見ることができますが、私はまだそれらを混乱させる。

2つの違いは何ですか?

1つはブロックされ、もう1つはブロックされませんか?

答えて

16

これらは両方とも将来が完了するまでブロックされますが、その違いは戻り値の型だけです。

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 
:あなたの Futureが例外をスローした場合

違いが便利です

1

一般に、両方ともブロックしています。

違いは、一定時間内に未完了(成功または失敗)になるまで、Await.readyがブロックされていることです。

唯一の違いはAwaitableが準備完了になり、結果タイプがTになるまでreadyブロックであることです。

Postscriptum:実際には あなたはエラーチェックやログインのようないくつかのアクションを実行したい場合は、結果を構成し、エラーをスローするようにしたい場合は、何かが間違っテイクAwait.result(...)になった場合、あなたはAwait.ready(...)を取るだろう。

経験則として、Awaitを避けてください。