运行和启动线程之间的差异

我不明白启动和运行一个线程之间的差异,我testing了这两个方法,他们输出相同的结果,首先我使用run()的组合,并开始在同一个线程,他们做了如下相同的function:

public class TestRunAndStart implements Runnable { public void run() { System.out.println("running"); } public static void main(String[] args) { Thread t = new Thread(new TestRunAndStart()); t.run(); t.run(); t.start(); } 

}

输出是:

 running running running 

然后我看到run()方法的javadoc说: If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns所以我试图使用run()方法没有一个单独的runnable,如下所示:

 public class TestRun extends Thread { public void run(){ System.out.println("Running Normal Thread"); } public static void main(String[]args){ TestRun TR=new TestRun(); TR.run(); } } 

它也执行run()方法并打印Running Normal Thread虽然它没有单独的可运行的构造! 那么这两种方法的主要区别是什么?

Thread.run()不生成一个新的线程,而Thread.start()不会,即Thread.run实际上运行在与调用者相同的线程上,而Thread.start()创build一个新的线程运行该任务。

当你调用run ,你只是在当前线程中执行run方法。 你的代码因此不会是multithreading的。

如果你调用start ,这将启动一个新的线程, run方法将在这个新的线程上执行。

一个线程在其生命周期中经历了不同的阶段。 当你调用start()方法时,线程进入可运行状态而不是运行状态。

然后调度器从线程池中等待一个线程执行,并将其放到运行阶段。 在这个线程的实际执行发生。

在第一个示例中,您直接从主线程调用run()方法,然后通过调用t.start()从单独的线程调用一次。

在第二种情况下,t.start()创build一个单独的线程上下文,并从该上下文中调用t.run()。

您还包含run()方法的文档:

如果此线程是使用单独的Runnable运行对象构build的,则会调用该Runnable对象的运行方法; 否则,这个方法什么都不做,并且返回

这是真的,因为如果你不重写run()方法,那么它将简单地返回,导致该线程终止。 你已经重写了Thread对象中的run()方法,所以重写的方法(什么都不做)不被调用。