代码之家  ›  专栏  ›  技术社区  ›  Jus12

Scala参与者到非参与者的交互(或同步参与者到servlet的消息)

  •  2
  • Jus12  · 技术社区  · 14 年前

      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 确保有足够的时间 result 去更新,否则 0 已返回。什么是不使用 线程。睡眠 ? 我想我必须使用未来,但我不能让我的头周围的概念。我需要确保每个HTTP请求都获得一个唯一的随机数(当然,随机数只是为了解释问题)。如有提示或参考,将不胜感激。

    1 回复  |  直到 13 年前
        1
  •  3
  •   Viktor Klang    14 年前

    使用方法之一:

    !! <--返回一个你可以等待的未来

    !? <--使用超时的,完全同步是危险的

    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