运行 单独线程的结果不明确
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()
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
.
我有个东西本来觉得很直白,后来遇到了一个问题,想了想也没明白。
所以这是一个涉及两个线程的简单的最小代码片段:
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()
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
.