使用run()方法创建线程与使用构造函数相比有什么区别吗? 我注意到我可以启动线程,它在两个方面都是相同的。
new Thread MyThread().start
例如,作为构造函数:
public class MyThread extends Thread{
public MyThread(){
// Do something
}
}
或作为run()方法
public class MyThread extends Thread{
public void run(){
// Do something
}
}
构造函数或run()之间有什么区别吗?谢谢!
答案 0 :(得分:4)
两种情况下的行为都不相同
这些情况完全不同。
首先,您可能需要了解Thread
和非阻塞流程。 Thread
用于异步执行某些操作。因此,如果您想在执行其他操作时执行某些后台任务,则可以使用Thread
。一个很好的例子是GUI;你需要一个Thread
来监听GUI事件(鼠标点击,按下按钮),另一个需要进行长时间的处理。
现在,进入你的例子。
在Java中,Thread
由run
方法组成,该方法在调用start
方法时异步执行。因此,当覆盖Thread
时,您更改了run
方法。实际上你应该从不覆盖Thread
,你应该使用带有Runnable
的构造函数。这有很多原因,你应该阅读并发。
您放置在Thread
构造函数中的任何代码都将在调用构造函数的Thread
中执行,因此非异步调用。
答案 1 :(得分:2)
如果将代码放在run
方法中,则在调用start
时将启动一个新线程,该线程使用run
方法作为起点。但是,如果将代码放在构造函数中,它将在与调用构造函数的线程相同的线程中运行,因为构造函数是方法的特例。因此,如果您想在新线程中启动某些内容,请将其放在run
中,否则,将其放在构造函数中。此外,如果要启动一个线程,请不要调用Thread.run
,因为同样的原因是不将代码放入构造函数中。始终致电Thread.start()
。
答案 2 :(得分:1)
关键区别在于:
构造函数中的代码在调用构造函数时执行立即和同步。
程序将停止并等待该代码完成,然后再转到下一行代码。
如果您将代码放在run()
方法 AND 中使用Thread.start()
,代码将在一个单独的线程中执行(即它将异步运行)。
当run()
方法中的代码并行运行时,您的程序将继续执行(立即转到下一行代码)。
如果run()
中的代码需要很长时间才能执行,这会很有用。
那是因为你的程序在等待线程完成其工作时可以继续做其他事情。
答案 3 :(得分:0)
有区别。创建Runnable
或其子类的构造函数在主线程中运行。
使用以下方式启动线程时
new Thread(myRunnable).start();
你实际上run(
myRunnable
在新主题中运行。
NB在许多情况下,您希望获得对线程对象的引用。此代码示例仅为说明性的
另一方面,如果在构造函数中启动,永远不会给出一个线程this
。您的计算机可能会爆炸,或者可能发生窒息,溺水或中毒。