Java线程跟踪中"new"周围的括号是什么意思?

3

我开始使用Java编写多线程程序,看到了Oracle教程中的一行代码,但是我不明白它的作用,希望有人能为我解答:

(new Thread(new HelloRunnable())).start();

在这一行中,声明了一个新的线程,但没有直接应用到对象上,然后立即调用start方法来运行该线程。这是如何工作的?为什么new关键字在这个括号内起作用?我希望能对这里正在发生的事情有些澄清,谢谢。完整的源代码来自:http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

谢谢您的评论,我想知道的一个具体问题是,在使用new之前加上括号的语法目的是什么?这是为了告诉解释器我们不是将新对象应用于变量吗? - TheEllo
1
括号没有任何作用。将它们删除并重新编译,将生成完全相同的代码。 - erickson
是的,它们只是为了方便阅读。 - Victor
再次感谢您澄清事情,我不喜欢在理解方面存在疑虑。 - TheEllo
它们实际上并没有增加阅读的便利性,正如这个问题所示。更有可能的是,它们存在是因为某人没有理解语法并认为它们是必需的。 - user207421
5个回答

3
Thread实例周围的括号是不必要的。以下内容同样有效。
new Thread(new HelloRunnable()).start();

如果你展开这个语句,它等同于这段代码。
Runnable myrunnable = new HelloRunnable();
Thread mythread = new Thread(myrunnable);
mythread.start();

本教程简明扼要。


1

这行代码的意思是:

// I have put it in block, as you don't have a reference to any of those objects afterwards
{
    // instantiate a runnable
    HelloRunnable runnable = new HelloRunnable(); 
    // instantiate a thread object that will use this runnable
    Thread thread = new Thread(runnable); 
    // start the thread (call the run method of the runnable on a new thread)
    thread.start(); 
}

0

这个代码有效是因为它是一个合法的语句。它在一个Thread对象上运行start()方法。Thread对象被创建为一个对象,而不仅仅是声明为一个引用变量。


0

你需要一个实现了Runnable接口的对象实例来传递给Thread构造函数;调用new HelloRunnable()可以得到它。

你需要一个Thread对象来运行;调用new Thread()可以得到它。

你在这个新的Thread实例上调用start()方法;它会调用你传递给它构造函数的Runnable实例的run()方法。


0
  1. 创建一个新的Thread对象并在其上调用start
  2. 为什么不呢?创建对象是一项与将其存储在变量中分开的操作。看看你如何创建HelloRunnable:你正在做同样的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接