質問

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 そして、それは機能するはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top