通过调用start()和run()来运行Thread,有什么区别?

时间:2012-11-29 06:17:33

标签: java multithreading

这可能是一个基本问题,我对此感到困惑,

在一个文件中我喜欢这个:

public class MyThread extends Thread {
    @Override
    public void run() {
        //stuffs
    }
}

现在在另一个文件中我有这个:

public class Test {
    public static void main(String[] args) {
        Thread obj = new MyThread();

        //now cases where i got confused
        //case 1
        obj.start();   //it makes the run() method run
        //case 2
        obj.run();     //it is also making run() method run
    }
}

所以在上面两种情况之间有什么区别,是情况1是创建新线程而情况2是不创建线程?这是我的猜测...希望能更好地回答SO guys.Thanks

7 个答案:

答案 0 :(得分:17)

start()在新帖子中运行run()中的代码。直接调用run()不会在新线程中执行run(),而是调用线程run()

如果直接致电run(),则表示您没有穿线。直接调用run()将阻止,直到run()中的任何代码完成为止。 start()创建一个新线程,由于run中的代码正在该新线程中运行,start()会立即返回。 (嗯,技术上不是立即,而是在完成创建新线程并将其踢掉之后。)

此外,您应该implementing runnable, not extending thread

答案 1 :(得分:2)

调用start()将创建一个新的执行线程,然后run()将在新创建的线程中执行

直接调用run()将执行当前线程中的代码

答案 2 :(得分:2)

    调用start()后的
  • run()方法:这是由你创建的线程执行的,它被分配处理器独立运行。

  • 你调用的
  • run()方法:从你的调用线程执行。

答案 3 :(得分:2)

您问题的简单答案是:

run():运行run()方法中的代码,阻塞直到完成

start():立即返回(不阻塞),另一个线程运行run()方法中的代码

答案 4 :(得分:2)

调用start 启动该主题。它执行创建和启动新线程的基础工作,然后在该新线程上调用run

调用run只需调用当前线程上的run方法。您永远不会直接致电run,请使用start

答案 5 :(得分:1)

在一行中直接调用run() 同步 (您的代码将阻止直到run()返回)并调用start()(您的代码不会等待运行完成,因为在其他线程obj中调用它是 异步

当您直接使用start()方法时,线程将使用您提供给它的Runnable实例运行一次,然后该线程将无法使用。

但是为了利用Java中内置的线程池和调度功能,可以扩展Runnable或Callable。

答案 6 :(得分:1)

start()启动线程。 run()只是在当前线程中运行代码。