Thread启动方法有什么需要?为什么不只有run方法?

时间:2014-07-19 17:26:09

标签: java multithreading

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

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

不要解释两种方法之间的区别,我想了解这种情况。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

  • - 已创建线程并可以启动
  • runnable - 正在执行线程
  • 等待 - 线程正在等待其他线程完成;其他线程必须通过在共享锁
  • 上调用示例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

答案 2 :(得分:1)

run()方法定义了线程将执行的操作。 start()方法启动线程以执行run方法实现的任务。

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

简单来说

  

调用Thread.start以启动新主题。

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

JavaDoc - Thread#start()提出了什么:

  

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

请参阅Defining and Starting a Thread Java教程

Read more...