2011-11-04 19 views
7

¿Por qué el siguiente código crear un punto muerto:Scala interbloqueo con colecciones paralelas

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

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

(es decir, A se imprime, pero tampoco B ni ninguna de las Processed ... líneas se imprimen.)

Sin embargo la siguiente código no causa un callejón sin salida: (. es decir, todo lo que se imprime)

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

Estoy ejecutando Scala versión 2.9.1.final.

+1

'advertencia: había 1 advertencias de deprecation' es una sugerencia de que las cosas no están del todo bien :-) – leedm777

Respuesta

13

Probablemente porque extender la aplicación, mientras que yo no podría decir lo que hace una diferencia entre los dos ejemplos.

con la aplicación, el código se ejecuta fuera del método main, en la inicialización de clase. La JVM está severamente limitada en este punto, notablemente relacionada con el multihilo. La aplicación está en desuso en favor de la aplicación, que tiene algo de magia (rasgo DelayedInit) que hace que el código se ejecute en main. Entonces object Test extends App debería arreglarlo.

+0

Esa es una respuesta mágica, tendré esto en cuenta con respecto al trabajo futuro propio. XD – Xorlev

Cuestiones relacionadas