【问题标题】:Thread as constructor or run()线程作为构造函数或 run()
【发布时间】:2013-07-26 01:45:11
【问题描述】:

使用 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
    }
}

constructor 和 run() 有什么区别吗?谢谢!

【问题讨论】:

  • 您的问题措辞非常不准确。那不是构造函数,那是Thread#start()Thread#run()的区别。
  • @MattBall - 实际上,问题是“在执行看起来像这样的代码时,将逻辑放置在构造函数中与将其放置在 run 方法之间有什么区别:@ 987654327@? 当然他的示例代码中充满了语法错误……

标签: java


【解决方案1】:

这两种情况的作用不同

这些情况完全不同。

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

现在,进入你的例子。

在 Java 中,Thread 包含一个 run 方法,该方法在调用 start 方法时异步执行。因此,当覆盖 Thread 时,您会更改 run 方法。实际上,您应该从不覆盖Thread,您应该使用采用Runnable 的构造函数。这有很多原因,您应该阅读并发。

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

【讨论】:

  • implements Runnable 比扩展Thread 更好的原因在这里:stackoverflow.com/questions/541487/… - 基本上更干净的 OO 设计
  • @zapl 还有其他更微妙的原因。例如,Thread 在其死亡时调用notifyAll - 这就是join 的工作方式;如果你扩展 Thread 并在 this 上同步,你可能会得到真的奇怪的结果......
【解决方案2】:

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

【讨论】:

  • 如果你想在一个新线程中开始一些事情,请将你的代码放入Thread.run() 使用Thread.start()启动线程。
【解决方案3】:

主要区别在于:

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

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

如果将代码放在run() 方法中AND 使用Thread.start(),代码将在单独的线程中执行(即异步运行)。

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

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

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

【讨论】:

    【解决方案4】:

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

    当使用以下方式启动线程时:

    new Thread(myRunnable).start();
    

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

    NB 在很多情况下,您都希望引用线程对象。这个代码示例只是说明性的

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2014-08-27
      • 2021-06-30
      相关资源
      最近更新 更多