【问题标题】:What is the need of Thread start method? why not have only run method? [duplicate]Thread start 方法需要什么?为什么不只有运行方法? [复制]
【发布时间】:2014-09-10 15:45:12
【问题描述】:

通过start方法运行线程需要什么?为什么不直接调用run方法呢?

What will happened if combined the code of start() and run() 
to make it as single method run()

不要解释这两种方法的区别,我想知道这种情况。

【问题讨论】:

  • @tmarwen 我想知道 start 和 run 方法里面更详细的代码
  • 如果没有这种方法,如何启动一个线程?在这种情况下,run 应该被视为“运行此代码[线程启动时]”,而不是“开始运行线程”。
  • @RajavelD 如果您只想查看代码,可以阅读源代码。它们是免费提供的,而且您很可能现在在您的机器上就有源代码。
  • +1 到 @ovunccetin 以获得真正解决问题的唯一答案(即 run() for 是什么,start() for 是什么)。
  • start() 方法的代码是 Java 标准库的一部分。您不能“将其与方法 run 结合使用”,因为如果您将 start() 的代码复制到子类中的 run(),标准实现会访问您无法访问的私有方法和字段。看起来您不了解 Java 中 Thread 的概念和目的。仔细阅读“重复”问题,在询问不可能的事情之前先理解这个概念非常重要。

标签: java multithreading


【解决方案1】:

When program calls start() method a new Thread is created and code inside run() method is executed in new Thread while if you call run() method directly no new Thread is created and code inside run() will execute on current Thread.

  • 每个线程都从一个单独的调用堆栈开始。

  • 从主线程调用 run() 方法,run() 方法进入当前调用堆栈而不是新调用堆栈的开头。

请参考What if we call run() method directly instead start() method?,也请参考Difference between start and run method in Thread

【讨论】:

    【解决方案2】:

    你需要知道线程可以有不同的状态。基于http://www.tutorialspoint.com/java/java_multithreading.htm,线程有5种状态

    • - 线程已创建并可启动
    • runnable - 线程正在执行
    • waiting - 线程正在等待其他线程完成;其他线程必须通过在共享锁上调用例如 notify 方法来通知该线程它已完成
    • 定时等待 - 类似于等待,但线程会在一段时间后自动停止等待,而无需等待来自其他线程的信号
    • 终止 - 线程完成了它的任务

    run 方法只包含在线程工作时需要执行的代码(当它处于 runnable 状态时)。

    需要start 方法来处理从newrunnable 的威胁状态变化,以便它可以开始工作并使用自己的资源(例如处理器时间)来执行来自run 方法的代码.

    当你调用yourThread.run()时,来自run方法的代码将由调用此方法的线程执行,但如果你使用yourThread.start(),则来自run方法的代码将使用yourThread的资源执行。

    看看这个例子

    public static void main(String[] args) {
        System.out.println("main started");
    
        Thread t = new Thread(){
            public void run() {
                try {Thread.sleep(2000);} catch (InterruptedException consumeForNow) {}
                System.out.println("hello from run");
            };
        };
        t.run();
    
        System.out.println("main ended");
    }
    

    run 方法中的代码将暂停运行它两秒的线程(因为Thread.sleep(2000);),所以你可以在两秒后看到hello from run

    现在的输出是这样的

    main started
    hello from run
    main ended
    

    因为run 方法中的代码是由main 线程(处理public static void main(String[] args) 方法的那个)执行的,也是因为两秒暂停部分

    hello from run
    main ended
    

    后来打印出来的。

    现在,如果您将t.run() 更改为t.start()run 方法中的代码将由t 线程执行。你会通过观察结果来看到它,这将是

    main started
    main ended
    

    (来自主流)两秒后

    hello from run
    

    【讨论】:

      【解决方案3】:

      简单来说

      调用Thread.start 以启动新线程。

      如果您直接调用run 方法,那么它就像在同一个线程中的普通方法调用一样。

      JavaDoc - Thread#start() 声明的内容:

      使该线程开始执行; Java 虚拟机调用该线程的run 方法。

      参见Defining and Starting a Thread Java 教程

      Read more...

      【讨论】:

        【解决方案4】:

        run() 方法定义线程将做什么。 start() 方法启动线程以执行由 run 方法实现的任务。

        如果直接调用run方法,则由调用者线程执行。但是,start 方法会导致在新启动的线程中处理任务。在前一种情况下,调用者线程等待 run 方法完成。另一方面,在后一种情况下,新创建的线程异步执行,因此调用者线程继续其工作,而无需等待 run 方法的完成。

        【讨论】:

          【解决方案5】:

          如果你直接调用线程的 run() 方法,那么该方法内部的代码将在调用 run() 方法的线程中运行。调用 start() 将创建一个新线程并在新线程上执行 run() 方法中的代码。

          简单地直接调用 run() 可能是一个错误,因为您实际上并没有创建新线程。

          请参阅以下链接以获取参考。

          http://javarevisited.blogspot.co.uk/2012/03/difference-between-start-and-run-method.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-24
            • 1970-01-01
            • 2017-03-09
            • 2010-11-02
            • 2022-11-10
            • 2021-01-06
            • 2012-12-28
            • 1970-01-01
            相关资源
            最近更新 更多