启动线程为啥是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.youkuaiyun.com/qq_44891295/article/details/116428481
https://blog.youkuaiyun.com/weixin_47082274/article/details/106071357
https://blog.youkuaiyun.com/hanqing456/article/details/113801097

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值