运行和启动线程之间的区别

Jav*_*yer 7 java multithreading

我不明白启动和运行线程之间的区别,我测试了两种方法并输出了相同的结果,首先我在同一个线程上使用了run()和start的组合,并且它们执行的功能如下:

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(); 
}
Run Code Online (Sandbox Code Playgroud)

}

输出是:

running
running
running
Run Code Online (Sandbox Code Playgroud)

然后我看到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 Code Online (Sandbox Code Playgroud)

并且它还执行run()方法并打印,Running Normal Thread尽管它的构造没有单独的runnable!那么这两种方法之间的主要区别是什么

Ext*_*ers 23

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


Den*_*ret 12

当你调用时run,你只是run在当前线程中执行该方法.因此,您的代码不会是多线程的.

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