【问题标题】:Difference between running and starting a thread [duplicate]运行和启动线程之间的区别[重复]
【发布时间】:2013-03-28 07:17:23
【问题描述】:

我不明白启动和运行线程之间的区别,我测试了这两种方法,它们输出相同的结果,首先我使用了 run() 和在同一个线程上启动的组合,它们执行相同的功能如下:

public class TestRunAndStart implements Runnable {
public void run() {
    System.out.println("running");
}
public static void main(String[] args) {
     Thread t = new Thread(new TestRunAndStart());
     t.run();
     t.run();
     t.start(); 
}

}

输出是:

running
running
running

然后我看到 run() 方法的 javadoc 说: If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns 所以我尝试使用 run() 方法而不使用单独的可运行对象,如下所示:

public class TestRun extends Thread {
public void run(){
    System.out.println("Running Normal Thread");
}
public static void main(String[]args){
    TestRun TR=new TestRun();
    TR.run();
   }

}

它还执行 run() 方法并打印Running Normal Thread,尽管它是在没有单独的可运行文件的情况下构造的!那么这两种方法的主要区别是什么

【问题讨论】:

  • 不是重复的!
  • 然而为时已晚。但可能对其他人有帮助。将运行方法SOP语句替换为“System.out.println("running thread..." + Thread.currentThread().getName());”然后执行你的程序。你会看到不同之处。输出是“正在运行的线程...主运行线程...主运行线程...Thread-0”

标签: java multithreading


【解决方案1】:

Thread.run() 不会产生新线程,而Thread.start() 会产生,即Thread.run 实际上与调用者的线程在同一个线程上运行,而Thread.start() 创建一个新线程来运行任务。

【讨论】:

  • 好的,但我不明白“如果这个线程是使用单独的 Runnable 运行对象构造的”的含义,我的示例中的 TestRun 类被认为是在没有单独的 Runnable 的情况下构造的??
  • @JavaPlayer 检查 this 为你的答案发帖
【解决方案2】:

当您调用run 时,您只是在当前线程中执行run 方法。因此,您的代码不会是多线程的。

如果你调用start,这将启动一个新线程,run 方法将在这个新线程上执行。

【讨论】:

    【解决方案3】:

    线程在其生命周期中会经历不同的阶段。 当您调用 start() 方法时,线程进入可运行状态而不是运行状态。

    然后调度程序从等待执行的线程池中提取一个线程并将其置于运行阶段。在此线程的实际执行发生。

    【讨论】:

      【解决方案4】:

      在您的第一个示例中,您直接从主线程调用 run() 方法,然后通过调用 t.start() 从单独的线程调用一次。

      在第二种情况下,t.start() 创建一个单独的线程上下文,并从该上下文调用 t.run()。

      您还包含了 run() 方法的文档:

      如果此线程是使用单独的 Runnable 运行对象构造的, 然后调用 Runnable 对象的 run 方法;否则,这 方法什么都不做并返回

      这是真的,如果你不重写 run() 方法,那么它会简单地返回,导致该线程终止。 您已经覆盖了 Thread 对象中的 run() 方法,因此不会调用被覆盖的方法(什么都不做)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-23
        • 2010-12-30
        • 2021-06-27
        • 2021-05-01
        • 1970-01-01
        • 2014-08-16
        • 2011-04-08
        • 2012-11-24
        相关资源
        最近更新 更多