Scala: ¿el hilo no puede acceder a la variable fuera del hilo?

Scala: ¿el hilo no puede acceder a la variable fuera del hilo?

object Test extends App {
  val x = 0
  val threadHello = (1 to 5).map(_ => new Thread(() => {
    println("Hello")
    println(x) // this results in join never resolving "collecting data"
  }))
  threadHello.foreach(_.start())
  threadHello.foreach(_.join())
  println(x)
}

Todavía estoy aprendiendo sobre la simultaneidad en Scala, pero tengo un problema en el que thread.join() nunca se resuelve y el programa termina ejecutándose para siempre, A MENOS QUE comente la instrucción println(x) .

La depuración revela que el hilo nunca puede acceder al valor de x, y no estoy seguro de por qué esto es un problema.

El problema resaltado al depurar en IntelliJ

Mostrar la mejor respuesta

1. No use subprocesos simples, use Futures o incluso abstracciones de mayor nivel como actores, streams o IO - 2. Supongo que el problema es el uso de App cambia a un método simple main.

Su código realmente funciona bien para mí, en Scala 2.13.

Dicho esto, sospecho que su problema tiene que ver con el orden de inicialización de vals en scala.App. Si es así, debería poder solucionarlo haciendo x lazy, así:

object Test extends App {
  lazy val x = 0
  val threadHello = (1 to 5).map(_ => new Thread(() => {
    println("Hello")
    println(x) // this results in join never resolving "collecting data"
  }))
  threadHello.foreach(_.start())
  threadHello.foreach(_.join())
  println(x)
}

Alternativamente, simplemente no use scala.App:

object Main {
  def main(args: Array[String]) {
    val x = 0
    val threadHello = (1 to 5).map(_ => new Thread(() => {
      println("Hello")
      println(x) // this results in join never resolving "collecting data"
    }))
    threadHello.foreach(_.start())
    threadHello.foreach(_.join())
    println(x)
  }
}