1

Future私は Scala 2.10の新しい API がとても気に入っています。それを単純なスクリプトに使用しようとしています。プログラムの要点は次のとおりです。

  1. ある URL への HTTP リクエスト
  2. 応答に基づいて必要なユーザー入力
  3. さらなる処理

アイデアは、すべてを Future のチェーン (フラットマップなど) として実装することですが、ここに私の問題があります:

現在、SBT でテストを行っているため、メイン スレッドが終了すると、SBT は REPL に戻ります。その間、私のFuture計算はまだユーザー入力を待っています。readLine入力しようとすると、ステップ 2 の呼び出しが、SBT が行おうとしている入力と競合しているように見えます。

たとえば、意図した入力が だったabcdefghijklmnop場合、プログラムは のようなランダムなサブセットを受け取り、adghipそれが終了すると、SBT はそれbcefjklmnoがコマンドではないことを教えてくれます。

どうすれば...

  1. フューチャーのデーモン スレッドの前にメイン スレッドが終了するのを遅らせる
  2. またはreadLine、SBT と競合しない他の呼び出しに置き換えます
4

1 に答える 1

0

scala.concurrent.Await( JavaDoc )を使用します。たぶん、次のスケッチはあなたが探しているものですか?

import scala.concurrent.Future
import scala.concurrent.ExecutionContext._
import scala.concurrent.duration.Duration
import scala.concurrent.duration._
import scala.concurrent.Await
import java.util.concurrent.Executors.newScheduledThreadPool

object Test {
  implicit val executor = fromExecutorService(newScheduledThreadPool(10))
  val timeout = 30 seconds

  def main(args: Array[String]) {
    val f =
      // Make HTTP request, which yields a string (say); simulated here as follows
      Future[String] {
        Thread.sleep(1000)
        "Response"
      }.
        // Read input
        map {
          response =>
            println("Please state your problem: ")
            val ln = readLine() // Note: this is blocking.
            (response, ln)
        }.
        // Futher processing
        map {
          case (response, input) =>
            println("Response: " + response + ", input: " + input)
        }
    Await.ready(f, timeout)
  }
}
于 2012-12-16T00:48:09.547 に答える