2

私は次のscalaコードを持っています:

  package dummy
  import javax.servlet.http.{HttpServlet,
    HttpServletRequest => HSReq, HttpServletResponse => HSResp}
  import scala.actors.Actor

  class DummyServlet extends HttpServlet {
    RNG.start
    override def doGet(req: HSReq, resp: HSResp) = {
      def message = <HTML><HEAD><TITLE>RandomNumber </TITLE></HEAD><BODY>
           Random number = {getRandom}</BODY></HTML>
      resp.getWriter().print(message)
      def getRandom: String = {var d = new DummyActor;d.start;d.getRandom}
    }
    class DummyActor extends Actor {
      var result = "0"
      def act = { RNG ! GetRandom
        react { case (r:Int) => result = r.toString }
      }
      def getRandom:String = {
        Thread.sleep(300)
        result
      }
    }
  }

  // below code is not modifiable. I am using it as a library
  case object GetRandom
  object RNG extends Actor {
    def act{loop{react{case GetRandom=>sender!scala.util.Random.nextInt}}}
  }

上記のコードでは、更新するのにthread.sleep十分な時間を確保するために使用する必要があります。そうしないと、が返されます。使用せずにこれを行うためのよりエレガントな方法は何ですか?私は先物を使わなければならないと思いますが、その概念に頭を悩ませることはできません。各HTTP要求が一意の乱数を取得するようにする必要があります(もちろん、乱数は問題を説明するためだけのものです)。いくつかのヒントや参考資料をいただければ幸いです。result0thread.sleep

4

1 に答える 1

3

次のいずれかを使用します。

!! <-- 待つことができる Future を返します

また

!? <-- タイムアウトのあるものを使う、完全同期は危険

RNG の定義を考えると、検証する REPL コードがいくつかあります。

scala> def foo = { println(RNG.!?(1000,GetRandom)) } 
foo: Unit

scala> foo
Some(-1025916420)

scala> foo
Some(-1689041124)

scala> foo
Some(-1633665186)

ドキュメントはこちら: http://www.scala-lang.org/api/current/scala/actors/Actor.html

于 2010-08-03T15:46:52.017 に答える