| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Java并发编程(二):Thread与Runnable的底层原理 -> 正文阅读 |
|
[Java知识库]Java并发编程(二):Thread与Runnable的底层原理 |
一、Thread类与Runnable接口的渊源本篇是Java并发编程系列第二章,本章主要讲解Thread类与Runnable接口。 (1)Runnable接口的内容详解在了解Thread类与Runnable接口之前,我觉得有必要先单独对Runnable接口做一个简略的概述。 首先,对于Runnable来说,Runnable,英文翻译一下,就是可运行的,可执行的。但是我如果给他换一种写法呢?RUNNABLE,眼熟吗?这不就是我上一篇文章中提到的RUNNABLE运行状态吗? 如果我们再看一眼Runnable的接口的源码,我们或许就能知道其中委实了。
什么意思?读到这里,有两点问题。 (1)为什么Runnable接口只有一个方法? (2)既然可以通过集成Thread类来达到实现创建线程类,为什么还要实现Runnable接口? 讲到这里,我觉得需要提一下!在大多数情况下,如果您只打算覆盖 run() 方法而不打算覆盖其他 Thread 方法,则应该直接使用 Runnable 接口。这很重要,除非你打算修改或增强类的基本行为,否则不应继承Thread类。。 下面我们来讲解一下问题的答案。 首先,对于第一个问题。我们只需要看Runnable接口的源码就可以发现端倪。没错,就是这个接口上面的@FunctionalInterface。这是什么?这是函数式接口。只有一个抽象方法,这是函数式接口的定义。这种定义是出现在jdk1.8之前的。其次,我们既然可以直接通过继承Thread类来实现线程的创建,为什么还要去另搞一个Runnable接口呢?继承Thread类就可以达到目的,再去实现Runnable接口,岂不是多此一举?其实不然,通过查阅Thread类源码,我们会得知,Thread类实现了Runnable接口,如下图所示。
我希望你脑海中存在一个疑问:为什么我以继承Thread类的形式来实现线程,却还需要重写Thread的run方法?这是为什么? 我暂且用两张图来说明继承Thread类与实现Runnable接口两种原则上看似不同实则相同的线程实现方式背后的小问题。请看下面两张图:
(2)Thread类的Start() 方法的底层实现与原理分析接上文,我们说,实现线程是实现Runnable接口,但是要想启动线程,底层依靠的是Thread内部类的native本地方法start0()。
我这里以虚拟机部分作为讲解案例。下载后能看见,hotspot内部的src下有一个os目录,os就是操作系统Operation System。里面做了具体的分类。windows、Linux等。
看到这里都已经明白了,接下来就是全局搜索jvm.h文件了。
所以全局搜索Thread.cpp,进入源码分析。我们可以看到,底层创建系统线程的时候进行了OS的调用,让操作系统来创建线程,既然涉及到操作系统,那么一定会有区分。上文中提到得系统分类目录,与此处必定有关联,因此,我们只需要随便以一个操作系统为例,关注create_thread() 函数即可。
本节总结
好了,今天的Java学习笔记总结到这里。总体介绍了Java多线程中的Thread类底层实现原理,与Runnable接口的作用。知其然不知其所以然是很严重的,既然知道Java的内部细节,就要去了解一下内部细节是怎么通过底层代码实现的。一年之前的约定,jvm源码系列详解,也会陆续更新。不过,我想还是有始有终,先把Java并发编程系列更新完毕!本系列可能会非常长,因为大多直接介绍底层实现原理,涉及到源码部分的诸多内容,希望同为钟爱Java、学习Java的兄弟姐妹们,有笔误的地方请一定告知在下,不能误导大家!我会及时更改的!好了,今天的内容到此结束,后续会持续更新,下节预告: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 18:47:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |