scala.concurrent.Future wrapper for java.util.concurrent.Future

前端 未结 4 1762
执念已碎
执念已碎 2020-12-06 04:36

I\'m using Play Framework 2.1.1 with an external java library that produces a java.util.concurrent.Future result. I\'m using the scala future\'s as opposed to Akka which I t

相关标签:
4条回答
  • 2020-12-06 05:12

    The scala-java8-compat library provides converters between java8 and Scala Futures.

    Specifically, you can use FutureConverters.toScala(connectionPool.getConnectionAsync()) to convert the java.util.concurrent.Future to scala.concurrent.Future

    0 讨论(0)
  • 2020-12-06 05:14
    Future {
      blocking {
        jfuture.get
      }
    }
    

    This lets the ExecutionContext know that what you are doing is going to block, giving it a chance to allocate more threads. If you do not include blocking { } then you may run out of threads.

    0 讨论(0)
  • 2020-12-06 05:26
    import java.util.concurrent.{Future => JFuture}
    import scala.concurrent.{Future => SFuture}
    

    You can't wrap JFuture with SFuture without blocking since there is a callback in SFuture (onComplete) and there is only blocking get in JFuture.

    All you can do is to create additional thread and block it with get, then complete Promise with result of get.

    val jfuture: JFuture[T] = ???
    val promise = Promise[T]()
    new Thread(new Runnable { def run() { promise.complete(Try{ jfuture.get }) }}).start
    val future = promise.future
    

    You could check isDone in endless loop, but I don't think it is better then blocking.

    0 讨论(0)
  • 2020-12-06 05:27
         import java.util.concurrent.{Future => JFuture}
         import scala.concurrent.ExecutionContext.Implicits.global
         import scala.concurrent.Future
         import scala.util.Try
    
         object JFuture2SFuture {
            val jFuture: JFuture[Int] = ???
            val promise = Promise[Int]()
            Future { promise.complete(Try(jFuture.get)) } //it is non blocking 
            val sFuture:Future[Int] = promise.future
    
         }
    
    0 讨论(0)
提交回复
热议问题