运行 单独线程的结果不明确

Unclear result with running a separate thread

我有个东西本来觉得很直白,后来遇到了一个问题,想了想也没明白。

所以这是一个涉及两个线程的简单的最小代码片段:

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

但这正是我看到的程序输出。 你们能帮我理解为什么它不打印出它创建的单独线程的名称吗?

这段代码

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

使用覆盖的方法 run 定义类型 Thread 的变量 t,然后 在同一线程上立即调用 run .

和写作没什么区别

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

tThread 类型而 qQ 类型这一事实无关紧要:runbar在主线程上执行,使用相同的堆栈。

只需将 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.