如何理解Scala中的“new {}”语法?

时间:2015-05-07 08:47:24

标签: multithreading scala

我正在学习Scala多线程编程,并通过参考教程编写一个简单的程序:

object ThreadSleep extends App {
  def thread(body: =>Unit): Thread = {
    val t = new Thread {
      override def run() = body
    }
    t.start()
    t
  }
  val t = thread{println("New Therad")}
  t.join
}

我无法理解为什么在{}语句中使用new Thread {}。我认为它应该是new Threadnew Thread()。我该如何理解这种语法?

这个问题并没有完全复制到this one,因为我的问题是关于“new {}”的语法。

2 个答案:

答案 0 :(得分:3)

这是

的快捷方式
Display display = new Display();
Listener filter = new Listener() {
  @Override
  public void handleEvent( Event event ) {
    if( /* condition */ ) {
      event.doit = false;
    }
  }
};
display.addFilter( SWT.MouseDown, filter );

这称为匿名类,它就像在JAVA中一样: 您在这里使用覆盖new Thread() { ... } 方法创建新线程。这很有用,因为如果您只使用一次,则不必创建特殊类。 需要确认,但您可以覆盖,添加,重新定义所需的每个方法或属性。

请点击此处了解详情:https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

答案 1 :(得分:2)

通过编写new Thread{}您创建Thread的匿名子类,您将覆盖run方法。通常,您更喜欢创建Runnable的子类并使用它创建一个线程而不是子类化Thread

val r = new Runnable{ override def run { body } }
new Thread(r).start

这通常在语义上更正确,因为只有当您专门研究Thread类时,例如使用Thread,您才想要继承AbortableThread。如果您只想在线程上运行任务,Runnable方法就更合适了。