Непонятный результат с запуском отдельного потока - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть кое-что, что, на мой взгляд, было бы простым, но затем я столкнулся с проблемой, которую не могу понять, подумав некоторое время.

Итак, вот простой минимальный фрагмент кода, включающий два потока:

package com.alexander.arendar

package object concscalaprog {

  def thread(block: =>Unit):Thread = {
    val t = new Thread{
      override def run(): Unit = block
    }
    t.run()
    t
  }
}

и

package com.alexander.arendar.concscalaprog

object Chapter2 {

  def main(args:Array[String]):Unit = {
    val t1 = thread(println(Thread.currentThread().getName))
    t1.join()
  }

}

Я ожидал увидеть в консоли нечто отличное от

main

, но это былоименно то, что я видел в качестве выходной программы.Не могли бы вы, ребята, помочь мне понять, почему он не распечатывает название отдельного потока, который он создает?

1 Ответ

0 голосов
/ 19 сентября 2018

Этот фрагмент кода

val t = new Thread{
  override def run(): Unit = block
}
t.run()

определяет переменную t типа Thread с переопределенным методом run, а затем немедленно вызывает run в том же потоке .

Это ничем не отличается от написания

abstract class Q { def bar(): Unit }
val q = new Q { def bar(): Unit = println(Thread.currentThread.getName) }
q.bar()

Тот факт, что t относится к типу Thread, а q относится к типу Q, не имеет значения: оба runи bar выполняются в главном потоке, используя один и тот же стек.

Просто замените run() на start().

Вот более короткий пример, демонстрирующий это:

lazy val t: Thread = new Thread { 
  override def run(): Unit = { println(Thread.currentThread == t) } 
}
t.run()

дает false, тогда как

lazy val t: Thread = new Thread { 
  override def run(): Unit = { println(Thread.currentThread == t) } 
}
t.start()

дает true.

...