복붙노트

[SCALA] java.util.concurrent.Future에 대한 scala.concurrent.Future 래퍼

SCALA

java.util.concurrent.Future에 대한 scala.concurrent.Future 래퍼

나는 java.util.concurrent.Future 결과를 생성하는 외부 자바 라이브러리 플레이 프레임 워크 2.1.1을 사용하고 있습니다. 나는 스칼라 미래가 아니라 내가 플레이 2.1으로 옳은 일이라고 생각 Akka에 반대 것 사용하고 있습니다. 여전히 코드 비 차단을 유지하면서 어떻게 scala.concurrent.Future에 java.util.concurrent.Future를 마무리 할 수 ​​있습니까?

def geConnection() : Connection = {
  // blocking with get
  connectionPool.getConnectionAsync().get(30000, TimeUnit.MILLISECONDS)
}

위의 코드는 연결을 반환하지만이 차단됩니다 있도록 GET을 사용

def getConnectionFuture() : Future[Connection] = {
  future {
    // how to remove blocking get and return a scala future?
    connectionPool.getConnectionAsync().get(30000, TimeUnit.MILLISECONDS)
  }
}

이상적으로는 위와 같지만, GET을 통해 차단 코드가없는 코드와 같은 미래로의 연결을 반환하는 스칼라 기능을합니다. 또 어떤 것은 내가 아닌 차단하기 위해 함수에 넣어해야합니까.

모든 포인터는 좋은 것입니다.

해결법

  1. ==============================

    1.

    import java.util.concurrent.{Future => JFuture}
    import scala.concurrent.{Future => SFuture}
    

    당신은 미래의 콜백이 있기 때문에 차단 (onComplete를) 만 JFuture 얻을이 차단하지 않고 미래에 JFuture을 쌀 수 없습니다.

    당신이 할 수있는 모든 추가 스레드를 생성하고 GET 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
    

    당신은 무한 루프에서의 isDone을 ​​확인할 수 있습니다,하지만 난 더 나은 다음 차단 생각하지 않습니다.

  2. ==============================

    2.

    Future {
      blocking {
        jfuture.get
      }
    }
    

    이것은 ExecutionContext에 무슨 일을하는 것은, 블록에가는 것이 더 많은 스레드를 할당 할 수있는 기회를주고 있음을 알 수 있습니다. 당신이 차단 포함하지 않는 경우 {} 당신은 스레드가 부족할 수 있습니다.

  3. ==============================

    3.

         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
    
         }
    
  4. ==============================

    4.스칼라 - java8-의 compat 라이브러리는 java8와 스칼라 선물 사이의 컨버터를 제공한다.

    스칼라 - java8-의 compat 라이브러리는 java8와 스칼라 선물 사이의 컨버터를 제공한다.

    특히, FutureConverters.toScala이 (connectionPool.getConnectionAsync ()) scala.concurrent.Future에 java.util.concurrent.Future를 변환하는 데 사용할 수 있습니다

  5. from https://stackoverflow.com/questions/17215421/scala-concurrent-future-wrapper-for-java-util-concurrent-future by cc-by-sa and MIT license