Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 运行单独线程的结果不清楚_Multithreading_Scala_Java Threads - Fatal编程技术网

Multithreading 运行单独线程的结果不清楚

Multithreading 运行单独线程的结果不清楚,multithreading,scala,java-threads,Multithreading,Scala,Java Threads,我有一些我认为是直截了当的事情,但后来我遇到了一个问题,我想了一会儿后不明白 下面是一段涉及两个线程的简单代码: 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

package object concscalaprog {

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

我希望在控制台中看到与

主要

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

这段代码片段

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()
给出的
为假
,而

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

给出
true

以下是我在一行中对它的解释:
lazy val t:Thread=new Thread{override def run():Unit={println(Thread.currentThread==t)};t、 运行
。现在,“为什么这个打印
false
?”。我正在读这本书,并试图在一章的末尾做练习,注意到我的解决方案在测试中的表现并不像我预期的那样。所以我缩小了例子,看不出原因。你的例子对我来说更难理解,所以我不知道答案。我现在明白了。当我对你的问题发表评论时,我也不知道答案,我不得不重新阅读第32页,才碰到
t.start()
行;)诚然,一旦你看到它,就有点明显了,但如果
run/start
的区别在工作记忆中并不新鲜,那就有点令人惊讶了。
lazy val t: Thread = new Thread { 
  override def run(): Unit = { println(Thread.currentThread == t) } 
}
t.start()