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