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

客官°小女子只卖身不卖艺 2022-09-06 15:20 284阅读 0赞

一、通过start和run两种方式验证启动差异

  1. package com.test.thread;
  2. public class ThreadStartTest {
  3. public static void main(String[] args) throws Exception{
  4. System.out.println("*********run方式***启动一个线程**************************");
  5. threadRun.run();
  6. threadRun.join();//利用join控制多线程执行顺序,join代表让主线程即main线程,等待子线程运行结束后才继续执行
  7. System.out.println("*********start方式***启动一个线程**************************");
  8. threadStart.start();
  9. }
  10. static Thread threadRun = new Thread(() -> {
  11. for (int i=0;i<5;i++){
  12. System.out.println(Thread.currentThread().getName()+":"+i);//获取当前线程名称
  13. }
  14. });
  15. static Thread threadStart = new Thread(() -> {
  16. for (int i=0;i<5;i++){
  17. System.out.println(Thread.currentThread().getName()+":"+i);//获取当前线程名称
  18. }
  19. });
  20. }

执行结果如下
请添加图片描述
结果分析
用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

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线

    > 一、为什么要用线程池 一个线程执行某个任务的时间片可以分成3块,创建线程T1,执行任务T2,销毁线程T3,现实中往往是 T1+T3>T2,也就是真正执行任务花费的时间