3

作为scala和scalaz的新手,在使用promise的时候,遇到了问题。我的代码是这样的。

import scalaz._
import Scalaz._

object Main2 extends Application {
  def sleeper() = {
    Thread.sleep(2000)
  }
  val message = promise {
    println("begin")
    sleeper
    println("ok")
    "ok"
  }
  Thread.sleep(5000)
  println("try to get")
  println(message())
}

这个输出如下,看起来很奇怪。好像还没有调用 sleeper 方法,线程阻塞了。-

begin
try to get

但是,如果我将睡眠者替换为内联睡眠,它看起来很好 -

object Main2 extends Application {
  def sleeper() = {
    Thread.sleep(2000)
  }
  val message = promise {
    println("begin")
    Thread.sleep(2000)
    println("ok")
    "ok"
  }
  Thread.sleep(5000)
  println("try to get")
  println(message())
}

在这里输出 -

begin
ok
try to get
ok

不明白为什么,请各位大神指点一下?

4

1 回答 1

8

我不能给你一个完整的解释,但这个问题似乎与这个Application特征的一些问题有关。

简而言之: 的构造函数体Application运行得太早并且在静态初始化上下文中。那时,它不能很好地处理线程(如果有的话)。当前的Apdoc说:

引用该对象的线程代码将阻塞,直到静态初始化完成。但是,由于扩展 Application 的对象的整个执行过程都发生在静态初始化期间,如果并发代码必须与封闭对象同步,它将总是死锁。

Scala 2.9开始,有一个新App特性可以解决大多数这些问题,所以你需要做的就是编写object Main2 extends App它应该可以工作。

于 2012-01-11T10:12:08.340 回答