当前位置: 首页 > news >正文

为什么启动一个线程不用run()方法,而是用start()方法

在使用java多线程时,有三种方式创建线程 复习传送门
当使用继承Thread来实现多线程时,
我们会把线程执行的代码写在run() 方法中,
使用Thread的start()方法来启动一个线程。
代码如下:

public class ThreadDemo extends Thread{@Overridepublic void run() {System.out.println("this is demo thread :"+Thread.currentThread().getName());}public static void main(String[] args) {ThreadDemo t = new ThreadDemo();t.start();System.out.println("this is main thread :"+Thread.currentThread().getName());}
}

执行结果:

this is main thread :main
this is demo thread :Thread-0Process finished with exit code 0

main方法中,为什么不直接 调用 t.run() 来启动线程?
因为t.run()是调用实例方法(会直接在当前线程中执行run中的逻辑),
而start才是启动线程,在新线程中执行run方法里的逻辑。

我们来看看Thread类的 start 方法究竟做了什么?

    public synchronized void start() {if (threadStatus != 0)throw new IllegalThreadStateException();group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}}private native void start0();

可以看到,start() 方法中调用了 start0(),而 start0() 是一个native方法。
native 关键字表示该方法是一个本地方法,java中提供了机制可以调用C的方法,它可以通过动态库加载,可以通过navtive来调用。

Java中的线程,其实是由操作系统来提供的。
在Java高级语言与操作系统之间,是通过JVM来调用的。

线程的启动
start0()是JVM层面实现的方法。
start0() 方法会调用操作系统底层的指令去创建一个线程,并且启动线程。
操作系统通过调度算法,把生成的线程调度,分配给不同的CPU。
操作系统会调用JVM的run,最终调回Java Thread的run方法。
最终使得run中的逻辑在线程中运行。

当线程执行结束后,JVM会完成销毁。

http://www.lryc.cn/news/14205.html

相关文章:

  • Java File相关操作
  • LabVIEW利用矢量量化直方图开发人脸识别
  • RK3568工业开发板工控板说明
  • JavaScript Web API 来构建你不了解的网站
  • KeePass敏感信息明文传输漏洞复现 (CVE-2023-24055)
  • Android 11 中的权限更新
  • october-cms
  • 抖音怎样报白?报白需要审核哪些资料呢
  • Spring中的AOP
  • 文件系统与动静态库的基本了解
  • netty——IO、NIO、AIO进化之路
  • AI稳定生成图工业链路打造
  • 20230220华南金牌主板u盘启动
  • 测试团队都在用哪些不错的测试用例管理平台?盘点6大主流测试管理系统
  • linux 系统编程之线程
  • 从0开始学python -35
  • 1.14 golang中的结构体
  • 原创不易,坚持更难
  • 计算机网络 | 谈谈TCP的流量控制与拥塞控制
  • Flask入门(7):内置装饰器(钩子函数)
  • Java8新特性
  • 哈希表题目:设计哈希集合
  • java static关键字 万字详解
  • 光谱实验反射、透射光谱测量
  • 【基础算法】之 冒泡排序优化
  • Python | 线程锁 | 3分钟掌握【同步锁】(Threading.Lock)
  • Linux下安装MySQL8.0的详细步骤(解压tar.xz安装包方式安装)
  • leaflet 绘制多个点的envelope矩形(082)
  • CAJ论文怎么批量免费转换成Word
  • 面试必问: 结构体大小的计算方法