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



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

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

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

start()在新

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

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

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

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

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

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

run(

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

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

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

调用run只是调用当前线程上的 run 方法。您从不直接呼叫run,请使用start .

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

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

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

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

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

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

最新更新