启动线程为啥是start()而不是run()方法?
一、通过start和run两种方式验证启动差异
package com.test.thread;
public class ThreadStartTest {
public static void main(String[] args) throws Exception{
System.out.println("*********run方式***启动一个线程**************************");
threadRun.run();
threadRun.join();//利用join控制多线程执行顺序,join代表让主线程即main线程,等待子线程运行结束后才继续执行
System.out.println("*********start方式***启动一个线程**************************");
threadStart.start();
}
static Thread threadRun = new Thread(() -> {
for (int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+":"+i);//获取当前线程名称
}
});
static Thread threadStart = new Thread(() -> {
for (int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+":"+i);//获取当前线程名称
}
});
}
执行结果如下
结果分析
用run方法启动,控制台输出的线程名字都是main,说明我们 new Thread根本没有成功启动线程,main线程是我们主线程的名字(运行一个程序就会启动一个主线程)。
使用了start方法,控制台打印了Thread-0线程说明了,我们成功启动了一个名字叫做Thread-0的线程。这才是真正启动了一个线程。
start()启动线程->最终会执行run方法
run()就是一个普通的方法,没有真正的启动一个线程
二、原理分析
点击run()方法进行分析,结果如下
发现run方法只是简单的调用了实现类的run。没有进行任何的多线程处理。
通过点击start()方法进行分析,结果如下
start()方法中有个native修饰的start0(),它是本地方法,是JVM调用,底层是c/c++实现。所以说:真正实现多线程的效果,是start0(),而不是 run()。
Java 是跨平台的,可以在不同系统上运行,每个系统的 CPU 调度算法不一样,所以就需要做不同的处理,这件事情就只能交给 JVM 来实现了,start0() 方法自然就表标记成了 native。
参考文章
https://blog.csdn.net/qq\_44891295/article/details/116428481
https://blog.csdn.net/weixin\_47082274/article/details/106071357
https://blog.csdn.net/hanqing456/article/details/113801097
还没有评论,来说两句吧...