线程作为构造函数或run()

时间:2013-07-25 23:13:56

标签: java

使用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 个答案:

答案 0 :(得分:4)

两种情况下的行为都不相同

这些情况完全不同。

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

现在,进入你的例子。

在Java中,Threadrun方法组成,该方法在调用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。您的计算机可能会爆炸,或者可能发生窒息,溺水或中毒。