【问题标题】:Starting a Thread with run() instead of start() [duplicate]使用 run() 而不是 start() 启动线程 [重复]
【发布时间】:2014-07-30 12:46:50
【问题描述】:

我了解到启动线程的推荐方法是在线程对象上调用start() 方法。但这反过来又调用了run() 方法。那为什么不直接调用 run() 方法呢?

这是我尝试过的,但我没有得出任何结论:

public class Tester {
      public static void main (String[] args) {
        Runner r = new Runner();

        Thread t1 = new Thread(r, "Thread A(runnable)");
        Thread t2 = new Thread(r, "Thread B(runnable)");

        Thread s1 = new Strider("Thread C");
        Thread s2 = new Strider("Thread D");

        t1.run(); // t1.start();
        t2.run(); // t2.start();
        s1.run(); // s1.start();
        s2.run(); // s2.start();
      }
    }

    class Runner implements Runnable {
      private int counter;
      public void run() {
        try {
          for (int i = 0; i != 2; i++) {
            System.out.println(Thread.currentThread().getName() + " Runnable: " 
                  + counter++);
            Thread.sleep(1000);
          }
        }
        catch(InterruptedException e) {
          e.printStackTrace();
        }
      }
    }

    class Strider extends Thread {   
      private int counter;
      Strider(String name)    {
        super(name);
      }
      public void run()   {
        try {
          for (int i = 0; i != 2; i++) {
            System.out.println(Thread.currentThread().getName() + ": " 
                + counter++);
            Thread.sleep(1000);
          }
        }
        catch(InterruptedException e)     {
           e.printStackTrace();
        }
      }
    }

输出(使用 start()):变化

Thread A(runnable): 0
Thread C: 0
Thread B(runnable): 1
Thread D: 0
Thread B(runnable): 3
Thread D: 1
Thread A(runnable): 2
Thread C: 1

输出(使用 run()):始终保持不变

main Runnable: 0
main Runnable: 1
main Runnable: 2
main Runnable: 3
main: 0
main: 1
main: 0
main: 1

还请提供您对为什么不直接使用run() 的意见?

【问题讨论】:

  • 这个post 可能对你有帮助。
  • 调用run() 方法就像在当前线程中调用一个简单的方法。而start() 方法调用启动一个新线程并在内部调用run() 作为新线程的一部分。
  • @user3218114 这很有帮助,但它似乎是一个旧答案 - 使用 stop()
  • Thread 暴露了一个公共的run() 方法这一事实可以被视为一个历史错误。
  • 我认为是stackoverflow.com/questions/8052522/…的复制品

标签: java multithreading runnable


【解决方案1】:

直接调用 run 方法不会启动线程,而是像 Java 中的任何其他方法调用一样是同步调用。因此输出始终保持不变。

只有在调用 start 方法时,才会涉及到实际的 Java 基础架构并创建一个新线程,然后再调用 run 方法。

【讨论】:

    【解决方案2】:

    如果显式调用 run 方法,则不会有新线程 开始了。直接调用run()只是同步执行代码 (在同一个线程中),就像普通的方法调用一样。

    Thread 类的 run() 方法什么都不做,所以子类应该用代码覆盖该方法以在第二个线程中执行。如果使用 Runnable 参数实例化 Thread,则该线程的 run() 方法将在新线程中执行 Runnable 对象的 run() 方法。

    根据线程程序的性质,直接调用 Thread run() 方法可以得到与通过 start() 方法调用相同的输出,但在后一种情况下,代码实际上是在新线程中执行的。

    【讨论】:

    • 但是如果使用 runnable 创建线程,它会打印到 3,而在扩展线程的情况下,它会按预期打印到 1。 runnabel 案例 t1 和 t2 似乎让我感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多