2016-01-27 54 views
3

我有一個Java Future對象,我想將其轉換爲Scala Future。查看j.u.c.Future API,除了isDone方法以外,沒有什麼可以使用的。這是阻止完成方法嗎?將Java未來轉換爲Scala未來

目前,這是我在我的腦海:

val p = Promise() 
if(javaFuture.isDone()) 
    p.success(javaFuture.get) 

有沒有更好的方式來做到這一點?

回答

1

如何只包裝它(我假設這裏有一個隱含的ExecutionContext):

val scalaFuture = Future { 
    javaFuture.get 
} 

編輯:

一個簡單的輪詢策略看起來是這樣的(java.util.Future => F):

def pollForResult[T](f: F[T]): Future[T] = Future { 
    Thread.sleep(500) 
    f 
    }.flatMap(f => if (f.isDone) Future { f.get } else pollForResult(f)) 

這將檢查Java未來是否每500ms完成一次。顯然總阻塞時間與上述相同(四捨五入到最接近的500ms),但此解決方案將允許其他任務在ExecutionContext的同一線程中交錯。

+0

是啊!我已經包裝了它,但只是想着是否有更好的方法去做,因爲我知道Java未來的get操作是一個阻塞操作! – sparkr

+0

是的,但是由此產生的斯卡拉「未來」不是。也就是說,「包裝」操作是非阻塞的。 – pablochan

+2

這是真的,但雖然這不會阻塞當前線程,但仍會阻塞來自ExecutionContext線程池的線程。 –