运行和启动线程之间的差异
我不明白启动和运行一个线程之间的差异,我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()方法,所以重写的方法(什么都不做)不被调用。