質問
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())
}
この出力は、奇妙に見えます。スリーパーメソッドは呼び出されておらず、スレッドがブロックされているようです。 -
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
理由がわかりません、グルスをお願いできますか?
解決
私はあなたに完全な説明をすることはできませんが、問題はいくつかの問題に関連しているようです Application
特性。
要するに、のコンストラクターボディ Application
早すぎて静的初期化のコンテキストで実行されます。その時点では、スレッドをあまりうまく処理しません(たとえあれば)。 現在のアピドック 言う:
オブジェクトを参照するスレッドコードは、静的初期化が完了するまでブロックされます。ただし、オブジェクト拡張アプリケーションの完全な実行が静的初期化中に行われるため、同時コードは、囲まれたオブジェクトと同期する必要がある場合、常にデッドロックします。
から始まる Scala 2.9, 、新しいものがあります App
これらの問題のほとんどを解決する特徴なので、あなたがする必要があるのは書くことだけです object Main2 extends App
そして、それは機能するはずです。
所属していません StackOverflow