我不明白启动和运行线程之间的区别,我测试了两种方法并且它们输出相同的结果,首先我使用了run()的组合并在同一线程上启动并且它们执行相同的功能如下:
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
所以我尝试使用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
,尽管它的构造没有单独的runnable!那么两种方法之间的主要区别是什么
答案 0 :(得分:23)
Thread.run()
不生成新线程而Thread.start()
生成,即Thread.run
实际上在与调用者相同的线程上运行,而Thread.start()
创建新线程任务运行。
答案 1 :(得分:12)
当你调用run
时,你只是在当前线程中执行run
方法。因此,您的代码将不是多线程的。
如果你打电话给start
,这将启动一个新线程,run
方法将在这个新线程上执行。
答案 2 :(得分:1)
线程在其生命周期中经历各个阶段。 当你调用 start()方法时,线程进入runnable状态而不是运行状态。
然后调度程序从一个等待执行的线程池中找到一个线程并将其置于运行阶段。在此实际执行该线程。
答案 3 :(得分:0)
在第一个示例中,您直接从主线程调用run()方法,然后通过调用t.start()从单独的线程调用一次。
在第二种情况下,t.start()创建一个单独的线程上下文,并从该上下文调用t.run()。
您还包含了run()方法的文档:
如果使用单独的Runnable运行对象构造此线程, 然后调用Runnable对象的run方法;否则,这个 方法什么都不做并返回
这是真的,因为如果你不覆盖run()方法,那么它将简单地返回,导致该线程终止。 您已重写Thread对象中的run()方法,因此不会调用重写的方法(不执行任何操作)。