Java 线程作为构造函数或运行()

Java 线程作为构造函数或运行(),java,Java,使用run()方法创建线程与使用构造函数创建线程有什么区别吗? 我注意到我可以启动线程,它在两种方式下的行为都是一样的 new Thread MyThread().start 例如,作为构造函数: public class MyThread extends Thread{ public MyThread(){ // Do something } } 或者作为run()方法 构造函数和run()之间有什么区别吗?谢谢 如果将代码放入run方法,则调用start时

使用run()方法创建线程与使用构造函数创建线程有什么区别吗? 我注意到我可以启动线程,它在两种方式下的行为都是一样的

new Thread MyThread().start
例如,作为构造函数:

public class MyThread extends Thread{
    public MyThread(){
        // Do something
    }
}
或者作为run()方法


构造函数和run()之间有什么区别吗?谢谢

如果将代码放入
run
方法,则调用
start
时将启动一个新线程,该线程使用
run
方法作为起点。但是,如果将代码放入构造函数中,它将与调用构造函数的线程在同一线程中运行,因为构造函数是方法的特例。因此,如果您想在一个新线程中启动某些内容,请将其放入
run
,否则,请将其放入构造函数中。此外,如果要启动线程,请不要调用
thread.run
,原因与不将代码放入构造函数相同。始终调用
Thread.start()

存在差异。创建
Runnable
或其子类的构造函数在主线程中运行

使用以下命令启动线程时:

new Thread(myRunnable).start();
实际上,您将在新线程中运行
myRunnable的
run(

注意:在许多情况下,您都希望有一个对thread对象的引用


另一方面,如果在构造函数中启动,则永远不要给出线程
。您的计算机可能会爆炸,或者发生窒息、溺水或中毒。

这两种情况下的行为并不相同

这些情况完全不同

首先,您可能需要了解
线程
和非阻塞进程。
线程
用于异步执行某些操作。因此,如果您想在执行其他操作时执行一些后台任务,则可以使用
线程
。GUI就是一个很好的示例;您需要一个
线程
来侦听GUI事件s(鼠标点击、按钮按下)和另一个按钮来执行任何长时间运行的处理

现在,来看看你们的例子

在Java中,
线程
由一个
运行
方法组成,该方法在调用
开始
方法时异步执行。因此,当重写
线程
时,您更改
运行
方法。实际上,您应该从不重写
线程
,您应该使用接受
的构造函数>Runnable
。这有很多原因,您应该仔细阅读并发性


线程
构造函数中放置的任何代码都将在调用构造函数的
线程
中执行,因此这是而不是异步调用。

关键区别在于:

调用构造函数时,构造函数中的代码会立即执行,并同步执行

程序将停止并等待代码完成,然后再转到下一行代码

如果将代码放入
run()
method中,并使用
Thread.start()
,则代码将在单独的线程中执行(即,它将异步运行)

run()
方法中的代码并行运行时,程序将继续执行(立即移动到下一行代码)

如果执行
run()
中的代码需要很长时间,这将非常有用


这是因为您的程序可以在等待线程完成其工作时继续执行其他操作。

您的问题措辞非常不精确。这不是构造函数,这是
thread#start()
thread#run()
@MattBall之间的区别-实际上,问题是“在执行类似这样的代码时,将逻辑放置在构造函数中与将其放置在run方法中有什么区别:
newmythread().start()
?当然,他的示例代码充满了语法错误。
实现Runnable
比扩展
线程
更好的原因如下:-基本上更干净design@zapl还有其他更微妙的原因。例如,
线程
在其自身死亡时调用
notifyAll
——这就是
连接的方式
有效;如果您扩展
线程
并在
上进行同步
会导致非常奇怪的结果…如果您想在新线程中启动某些内容,请将代码放入
线程.run()
并使用
线程.start()
启动线程。
new Thread(myRunnable).start();