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

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

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

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

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

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

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

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

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

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

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

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

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

调用run只调用当前线程上的 run方法。 你永远不会直接调用run ,使用start

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

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

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

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

但是为了利用Java内置的线程池和调度function,扩展Runnable或Callable是可行的方法。

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