2

使用 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()之间有什么区别吗?谢谢!

4

4 回答 4

4

它在两种情况下的作用不同

这些情况完全不同。

首先,您可能需要了解Threads 和非阻塞进程。AThread用于异步执行某些操作。因此,如果您想在做其他事情的同时做一些后台任务,那么您将使用Thread. 一个很好的例子是 GUI。您需要一个Thread来监听 GUI 事件(鼠标点击、按钮按下),另一个来进行任何长时间运行的处理。

现在,到你的例子。

在 Java 中,aThread包含一个在调用run该方法时异步执行的start方法。因此,在覆盖Thread时更改run方法。实际上,您永远不应该覆盖Thread,您应该使用带有Runnable. 这有很多原因,您应该阅读并发性。

您放置在Thread构造函数中的任何代码都将在调用构造函数的 中执行,Thread因此不会异步调用。

于 2013-07-25T23:35:32.180 回答
2

如果将代码放入run方法中,调用时会启动一个新线程,该线程startrun方法为起点。但是,如果将代码放在构造函数中,它将在调用构造函数的线程中运行,因为构造函数是方法的一种特殊情况。因此,如果您想在新线程中启动某些内容,请将其放入 中run,否则将其放入构造函数中。另外,如果你想启动一个线程,永远不要调用Thread.run,因为同样的原因不要把代码放在构造函数中。总是打电话Thread.start()

于 2013-07-25T23:15:53.720 回答
1

关键区别在于:

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

该程序将停止并等待该代码完成,然后再继续执行下一行代码。

如果你把代码放在run()方法AND useThread.start()中,代码将在一个单独的线程中执行(即它将异步运行)。

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

如果代码run()需要很长时间才能执行,这将很有帮助。

那是因为你的程序可以在等待线程完成工作的同时继续做其他事情。

于 2013-07-26T00:08:51.667 回答
0

它们是有区别的。创建其Runnable子类或子类的构造函数在主线程中运行。

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

new Thread(myRunnable).start();

您实际上将在新线程run(中运行。myRunnable

注意在许多情况下,您会希望引用线程对象。此代码示例仅是说明性的

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

于 2013-07-25T23:16:10.760 回答