【问题标题】:Please explain the output from Thread run() and start() methods请解释 Thread run() 和 start() 方法的输出
【发布时间】:2010-06-12 04:32:14
【问题描述】:

请解释以下代码的输出:

如果我调用th1.run(),输出是:

EXTENDS RUN>>
RUNNABLE RUN>>

如果我调用th1.start(),输出是:

RUNNABLE RUN>>
EXTENDS RUN>>

为什么会出现这种不一致?请解释一下。

class ThreadExample extends Thread{
    public void run() {
        System.out.println("EXTENDS RUN>>");
    }
}

class ThreadExampleRunnable implements Runnable {
    public void run() {
        System.out.println("RUNNABLE RUN>>");
    }
}

class ThreadExampleMain{
    public static void main(String[] args) {
        ThreadExample th1 = new ThreadExample();
        //th1.start(); 
        th1.run();

        ThreadExampleRunnable th2 = new ThreadExampleRunnable();
        th2.run();
    }
}

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    Thread.start() 方法启动一个新线程,该线程的入口点是run() 方法。如果您直接调用 run() ,它将在同一个线程中执行。鉴于调用 Thread.start() 将启动一个新的执行线程,run() 方法可能会在 main 方法的其余部分执行之后(如您的示例)被调用。

    把你的main方法改成调用th1.start()重复运行,你会看到有时候会输出:

    EXTENDS RUN>>
    RUNNABLE RUN >>
    

    有时它会输出:

    RUNNABLE RUN >>
    EXTENDS RUN>>
    

    取决于 java 选择如何安排你的 2 个线程。

    在此查看java tutorial

    【讨论】:

    • 我试图理解为什么我在 Android 中的多线程不起作用。原来我总是叫run() 而不是start()
    【解决方案2】:

    当您调用th1.run() 时,您正在当前线程中运行run 方法,因此必须在调用th2.run() 之前发生。

    当您调用th1.start() 时,run 方法正在新线程上调用。在这种情况下,它发生在调用th2.run() 之后。 (事实上​​,理论上它可能发生在th2.run() 之前...但是thread.start() 的当前和以前的Sun 实现不会导致当前线程立即“让步”给新线程。)

    这说明了使用 Java 线程的一个常见错误。如果你想在一个新线程上运行东西,你必须调用thread.start()。直接调用thread.run() 几乎总是一个错误。

    【讨论】:

      【解决方案3】:

      当您调用.run() 时,将调用该方法,并且执行其中的代码与任何其他方法相同。但是,如果您在线程上调用 .start()run() 方法将在该线程中运行,而不是在主线程中按顺序运行。

      所以当你调用th1.start()时,你的代码会同时在两个线程中执行:主线程会继续创建th2然后调用它的run方法,而th1线程会调用它自己的run方法。无法保证它们的顺序,因为它们是并行执行的。

      【讨论】:

        【解决方案4】:

        执行 run() 是同步的 - 执行 start() 是异步的。

        run() 的调用只是一个常规的同步方法调用,它们按此顺序发生。使用th1.start(),启动了一个新线程——它现在是两匹马——两个运行方法现在独立执行——第一个到完成的获胜,并且不能保证顺序。

        但是如果不能保证顺序,为什么新的线程大部分时间都在后面打印呢?实际上,启动一个新线程需要一些时间,所以当它启动时,另一个run() 方法已经运行了。即使在多核机器上,两个线程可以同时执行,新线程通常也会排在最后,因为线程启动涉及更多工作。

        【讨论】:

          猜你喜欢
          • 2012-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多