启动线程为啥是start()而不是run()方法?

本文详细探讨了Java中线程启动的两种方式——start()和run()的区别。通过实例代码展示,start()方法会真正启动新线程并执行run(),而run()直接调用仅作为普通方法执行。分析start()方法内部,发现其通过native的start0()方法实现多线程,该方法由JVM底层实现,确保了跨平台的多线程效果。

一、通过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

Java 中,启动线程可以使用 `start()` 方法和 `run()` 方法,但两者存在明显区别。 使用 `start()` 方法才真正实现了多线程运行,调用该方法会新建一个线程,由这个新线程来执行 `run()` 方法中的代码。因为线程有创建、就绪、运行、阻塞、死亡这五种状态,`start()` 方法线程置于就绪状态,此线程并没有立即执行,而是等待 CPU 有空闲,才会执行线程里的 `run()` 方法,等 `run()` 方法执行完,线程就结束了。并且使用 `start()` 方法用等待 `run()` 方法执行完成就可以继续执行下面的代码,实现了多线程运行 [^1][^2]。 而直接调用 `run()` 方法会创建新线程,`run()` 方法中的代码是由主线程执行的,会顺序执行 `run()` 方法中的代码,等 `run()` 方法执行完才会继续执行后续代码,并没有实现多线程 [^1]。 以下是示例代码: ```java class MyRunnable implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + " 运行,i = " + i); } } } public class ThreadTest { public static void main(String[] args) { // 使用 start() 方法启动线程 Thread thread1 = new Thread(new MyRunnable()); Thread thread2 = new Thread(new MyRunnable()); thread1.start(); thread2.start(); // 使用 run() 方法 /* Thread thread3 = new Thread(new MyRunnable()); Thread thread4 = new Thread(new MyRunnable()); thread3.run(); thread4.run(); */ } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值