聊聊线程之run方法_start 是同步还是异步-程序员宅基地

话不多说

参考书籍 汪文君

补充知识:start是异步,run是同步,start的执行会经过JNI方法然后被任务执行调度器告知给系统内核分配时间片进行创建线程并执行,而直接调用run不经过本地方法就是普通对象执行实例方法。

什么是线程?

1.现在几乎百分之百的操作系统都支持多任务的执行,对计算机来说每一个人物就是一个进程(Process),在每一个进程内部至少要有一个线程实在运行中,有时线程也称为轻量级的进程。

2.线程是程序执行的一个路径,每一个线程都有自己的局部变量表、程序计数器、操作栈以及各自的生命周期(这部分可以参考周志明的深入了解jvm,每个线程都有自己的私有栈内存,其中包括虚拟机栈,本地方法区,程序计数器),现代操作系统中一般不止一个线程在运行,当启动了一个java虚拟机(jvm)时,从操作系统开始就会创建一个新的进程(jvm进程),JVM进程中将会派生或者创建很多线程。

怎么创建线程那?

这里要声明一下创建线程只有一种方式:构造Thread类

实现线程的执行单元有两种方式:1.重写Thread的方法 2.实现Runnable接口的run方法,并且讲Runnable实例用作构造Thread的参数。

我们开始实现执行单元

 

Thread t=new Thread(){

      @override

       public void run(){

         System.out.println("我是一个线程")

      }

};

t.start()或者调用t.run(),运行结果:我是一个线程   

问题来了那为什么调用start()和run()一样那?  这里看段线程start()源码

 start0()是什么方法那?是不是有点神秘,它跟run()方法有什么关系那? 简单的解释下:start0()是个JNI方法,他的作用就是回调本地方法,回归正传,在执行start()方法时,会调用start0()方法,然后虚拟机会回调本地重写的run()(run()方法是被JNI方法start0()调用的)有人问为什么为调用重写的方法哪?每个类都有自己的一个虚表,当每个方法被重写时此时也就是重写的方法会覆盖原有的方法,所以调用时会调用重写的方法,其实底层比这更复杂,想要更深入的可以看看虚拟机

线程注意事项:

  Thread被构造后的NEW状态,事实上threadStatus这个内部属性为-0

不能两次启动Thread,否则就会出现IllegalThreadStateException异常

线程启动后将会被放入一个T和read Group中,每个线程不是暴露在外的,都有一个线程组

一个线程生命周期结束,也就是到了TERMINATED状态(消亡)。再次调用start方法是不允许的,也就是说TERMINATED状态是没有办法会发哦RUNNABLE/RUNNING状态的

 

那Runnable怎么实现和调用run方法的那,下面我们慢慢来揭秘

第一步  实现执行单元      Thread t=new Thread(()->System.out.println("我是一个执行单元"));

t.start()和t.run()此时还是可以调用这有事为什么那? 难道和上边那个原理一样?答案:否 ,不然我也不会在这闲扯  

第二步揭秘  

不多说看源码 

t.start()会调用本地方法run()但是这个run是谁的run那?是Thread的还是Runnable的那,这里是Thread的run()方法,因为Thread自己本身就有个实现的run方法,虚表中存的也是Thread的run方法

 

疑问又来了,为什么调用的是Thread的run()执行的确是Runnable的run()那?  重点在target这个是什么对象 

原来如此target就是我们传进去的Runnable  ,那好我们再看Threadd的run()方法

 

Thread的run()方法调用Runnable的run(),所以执行的是Runnable的方法。

这两种实现还有一些注意:重写Thread类的run方法和实现Runnable接口的run方法还有一个很重要的不同,那就是Thread类的run方法是不能共享的,也就是说A线程不能把B线程的run方法当作自己的执行单元,而使用Runnable接口则很容易就能实现这一点,使用同一个Runnable的实例构造不同的Thread实例

 

后续更新线程的更多相关内容,线程的学习路上一起相伴

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sunboylife/article/details/83832122

智能推荐

Linux环境 docker启动redis命令_linux docker 重启 redis-程序员宅基地

文章浏览阅读1.1k次。docker启动redis命令_linux docker 重启 redis

【总结】插头DP-bzoj1210/2310/2331/2595_dp插头模型-程序员宅基地

文章浏览阅读325次。插头DP小结_dp插头模型

关于测试工作效率低的一些思考和改进方法_测试人员不足与改进-程序员宅基地

文章浏览阅读3.5k次。关于测试工作效率低的一些思考和改进方法引子  汇总统计了一下项目组近期测试项目实际工作量与基线工作量的对比,发现一个严重问题。就是工作效率特别低下。下面简单列举一下几个项目预期工作量和实际工作量以及时间耗费严重的地方、项目简要背景。  1、B版本测试。版本预期工作量15人天,实际耗费工作量在30人天。更为严重的是测试人员并没有因为测试周期延长和工作量投入加大而测试的更轻松,反而是测试期..._测试人员不足与改进

级联样式表_级联样式表| 第三部分-程序员宅基地

文章浏览阅读173次。级联样式表 CSS-难以成熟 (CSS — Difficult to maturation)Unlike software, the CSS specifications are developed by successive versions, which would allow a browser to refer to a particular version. CSS was devel..._级联样式表是哪年产生的

sql server学习笔记——批处理语句、存储过程_sql的批处理-程序员宅基地

文章浏览阅读1.7k次。目录批处理语句1、批处理语句简介示例一:示例二:存储过程一、什么是存储过程1、存储过程的简介2、存储过程包含的内容3、存储过程的优点4、存储过程的分类系统存储过程:用户定义存储过程5、常用的系统储存过程(1)一般常用的存储过程(2)xp_cmdshell二、创建存储过程1、定义存储过程的语法2、不带参数的存储过程3、带参数..._sql的批处理

css代码的定位及浮动

上次,我们解除了css的内外边距、鼠标悬停及其练习。现在我们学习css元素练习和定位。

随便推点

求助生物源排放模型MEGAN_megan v2.04-程序员宅基地

文章浏览阅读673次。有没有师兄师姐有meganv2.04以上的版本小弟只有低版本的 需要高版本运行一下有偿!_megan v2.04

java/jsp/ssm网络文学网站【2024年毕设】-程序员宅基地

文章浏览阅读32次。springboot基于springboot的小型超市库存管理系统。springboot基于SpringBoot的校园失物招领系统。springboot基于springboot的残障人士社交平台。springboot基于springboot的酒店管理系统。springboot基于springboot的电商购物系统。springboot基于微信小程序的Sunmoon口红商城。springboot基于云平台的便民物流速递信息管理系统。springboot基于微服务的固定资产管理系统。

还在用PPT做组织架构图?公司都在用的架构图软件是什么?_书本里印刷的结构图是用什么软件做的-程序员宅基地

文章浏览阅读3.1k次。还在用PPT、Word和Excel画企业组织结构图吗?对于人力资源的同事来说,画组织结构图是一键非常头疼的事情,尤其是对于一些大公司和人员变动较大的公司来说,需要经常更换组织结构图,每次变动都要耗费大量的时间和精力去重新绘图。其实绘制织结构图很简单,之所以难是因为没有找对工具和方法!今天小编就教你如何用亿图图示轻松绘制一个既美观又专业的组织结构图!下图是一个简单的组织结构图例子,小编就以此为例,详细讲解一下好看清晰、实用的公司组织结构图是怎么画出来的。1、新建组织结构图2、创建组织结构_书本里印刷的结构图是用什么软件做的

ESP32-C3 BLE5.0 扩展蓝牙名称长度的流程_蓝牙广播名称过长-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏5次。BLE5.0 扩展蓝牙名称长度_蓝牙广播名称过长

centos8安装NVIDIA显卡驱动,docker模式运行机器学习_centos8安装显卡驱动-程序员宅基地

文章浏览阅读3.5k次。centos8安装NVIDIA显卡驱动,docker模式运行机器学习_centos8安装显卡驱动

利用优先级拥抱需求变更_需求优先级反复变化-程序员宅基地

文章浏览阅读2.4k次。需求变更这件事,每个开发人员都遇到过,每个产品经理也都遇到过。 以前,我们会追求需求不变更,但无论是产品型团队还是项目型团队,需求不变更都是天方夜谈,不可能实现的。即使把需求变更的成本提得很高,流程搞得很复杂,又要填变更单,又要几级经理审批,又要需求评审,依然无法避免。 于是,团队的目标变成了少变更,希望尽量少的变更既能满足业务的需要,又能减少开发团队的反感。但‘少’是个相对的概念_需求优先级反复变化

推荐文章

热门文章

相关标签