2011-11-04 14 views
7

はなぜ以下のコードを、デッドロックを作成しない:(すなわちAが印刷され、どちらもBProcessed ...ラインのいずれかが印刷されます。)Scalaのデッドロック

object Test extends Application 
{ 
    def printProgress(i:Int) = 
    { 
    println("Processed " + i) 
    } 

    println("A") 
    (1 to 1000).par.foreach{ i => 
    printProgress(i) 
    } 
    println("B") 
} 

次しかしながら、コードは、デッドロックが発生しない:

object Test extends Application 
{ 
    println("A") 
    (1 to 1000).par.foreach{ i => 
    println("Processed " + i) 
    } 
    println("B") 
} 

(つまり、すべてが印刷されます。)

私はScalaバージョン2.9.1.finalを実行しています。

+1

'警告:1つの廃止警告がありました.'というものは正しくないとのヒントです:-) – leedm777

答えて

13

おそらく、アプリケーションを拡張すると、私はあなたの2つの例がどのような違いがあるのか​​を知ることができませんでした。

アプリケーションでは、コードはクラス初期化でメソッドmainの外で実行されます。この時点で、特にマルチスレッドに関連するJVMは厳しく制限されています。アプリケーションは、Appを優先して非難されています。これには、コードがmainで実行されるいくつかの魔法(Trait DelayedInit)があります。だからobject Test extends Appで修正する必要があります。

+0

これは魔法の答えです。私は自分の将来の仕事についてこれを覚えています。 XD – Xorlev