2

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

在一个文件中我有这样的:

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不是创建一个线程吗?这是我的猜测......希望有更好的答案所以伙计们。谢​​谢

4

7 回答 7

17

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

如果您run()直接调用,则不是线程。直接调用run()将阻塞,直到任何代码run()完成。 start()创建一个新线程,并且由于代码在run该新线程中运行,因此start()立即返回。(嗯,从技术上讲,不是立即,而是在创建新线程并启动它之后。)

此外,您应该实现可运行,而不是扩展线程

于 2012-11-29T06:19:28.277 回答
2

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

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

于 2012-11-29T06:20:14.190 回答
2
  • 调用 start() 后的 run() 方法:这是由您创建的线程执行的,它被分配处理器以独立运行。

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

于 2012-11-29T06:20:23.630 回答
2

你的问题的简单答案是这样的:

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

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

于 2012-11-29T06:22:06.447 回答
2

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

调用run只是调用当前线程上run的方法。你从不直接打电话,使用.runstart

于 2012-11-29T06:22:37.170 回答
1

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

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

但是要利用 Java 中内置的线程池和调度功能,扩展 Runnable 或 Callable 是可行的方法。

于 2012-11-29T07:20:02.250 回答
1

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

于 2012-11-29T21:12:57.707 回答