kotlin源码结构层次详解

目录
  • 协程源码的结构
    • 基础层
    • 中间层
    • 平台层

协程源码的结构

在研究Kotlin源码之前,得先搞懂Kotlin源码结构分布。不然找不到该看哪里的代码。看源码之前当然先得有一个目标,最好是带着这个目标去看源码才比较有针对性,抓主流程,不然可能会陷入浩瀚的源码细节中。

协程源码,按道理可以分成2个仓库,一个是Kotlin仓库,一个是Kotlin协程仓库。

Kotlin仓库中定义了协程的基础元素,这些基础元素非常关键,它们是构建协程的基础。而协程仓库相当于是用Kotlin仓库中定义的基础元素来实现协程的逻辑。

Kotlin协程源码分为3层:

  • 基础层:Kotlin库中定义的协程基础元素。比如CancellationException、CombinedContext、Continuation、ContinuationInterceptor、CoroutineContext、SafeContinuation等。
  • 中间层:协程仓库中,协程框架的通用逻辑kotlinx.coroutine-common。比如Job、Deferred、Select、Channel、Flow。
  • 平台层:协程仓库中,协程在特定平台的实现。如JVM、JS、Native。

下面,我们来详细了解一下这些层是怎么分布的。

基础层

Kotlin库中,协程的基础层具体位置是在/kotlin/libraries/stdlib/src/kotlin/coroutines/里面。官方把这些基础元素放标准库里面,是为了解耦。

  • 通过这些基础元素可以组合成各种协程框架,虽然目前是官方的协程框架组合的最好。
  • 在基础层定义好了API之后,协程库在各自的平台层才好有规可循,在这些API下面开发平台相关的代码。

中间层

在kotlin.coroutines库中的/kotlinx.coroutines/kotlinx-coroutines-core/common/子模块下,是一些公共的逻辑。比如launch、async、withContext、Deferred、Job、NonCancellable、Channel、Flow、AbstractCoroutine,这些东西是对基础层的元素进行的封装,使上手协程更容易。

在这些公共逻辑的源码里,是不涉及平台相关的逻辑的。

平台层

因为Kotlin是跨平台的,所以它的平台相关的逻辑又分为了js、jvm、native,它们的目录与common平级,分别是:

js:kotlinx-coroutines-core/js/

jvm:kotlinx-coroutines-core/jvm/

native:kotlinx-coroutines-core/native/

我们重点关注一下jvm的就行,下面是jvm目录下的代码,其他平台也需要实现其自己的线程池、事件循环、异步任务等。

.
├── AbstractTimeSource.kt
├── Builders.kt
├── CoroutineContext.kt
├── CoroutineExceptionHandlerImpl.kt
├── Debug.kt
├── DebugStrings.kt
├── DefaultExecutor.kt
├── Dispatchers.kt
├── EventLoop.kt    //事件循环
├── Exceptions.kt
├── Executors.kt
├── Future.kt
├── Interruptible.kt
├── Runnable.kt    //java.lang.Runnable
├── SchedulerTask.kt
├── ThreadContextElement.kt     //线程池
├── ThreadPoolDispatcher.kt
├── channels
│   ├── Actor.kt
│   └── TickerChannels.kt
├── debug
│   ├── AgentPremain.kt
│   └── internal
│       ├── AgentInstallationType.kt
│       ├── ConcurrentWeakMap.kt
│       ├── DebugCoroutineInfo.kt
│       ├── DebugCoroutineInfoImpl.kt
│       ├── DebugProbes.kt
│       ├── DebugProbesImpl.kt
│       ├── DebuggerInfo.kt
│       └── StackTraceFrame.kt
├── flow
│   └── internal
│       ├── FlowExceptions.kt
│       └── SafeCollector.kt
├── internal
│   ├── Concurrent.kt
│   ├── ExceptionsConstructor.kt
│   ├── FastServiceLoader.kt
│   ├── InternalAnnotations.kt
│   ├── LocalAtomics.kt
│   ├── MainDispatchers.kt
│   ├── ProbesSupport.kt
│   ├── ResizableAtomicArray.kt
│   ├── StackTraceRecovery.kt
│   ├── Synchronized.kt
│   ├── SystemProps.kt
│   ├── ThreadContext.kt
│   └── ThreadLocal.kt   //java.lang.ThreadLocal
└── scheduling
    ├── CoroutineScheduler.kt
    ├── Deprecated.kt
    ├── Dispatcher.kt
    ├── Tasks.kt
    └── WorkQueue.kt

以上就是kotlin源码结构层次详解的详细内容,更多关于kotlin源码结构的资料请关注我们其它相关文章!

(0)

相关推荐

  • Kotlin协程launch原理详解

    目录 正文 launch使用 launch原理 CoroutineStart中找invoke方法 startCoroutineCancellable逻辑 小结 正文 launch我们经常用,今天来看看它是什么原理. 建议: 食用本篇文章之前记得先食用Kotlin协程之createCoroutine和startCoroutine launch使用 launch我们应该很熟悉了,随便举个例子: fun main() { val coroutineScope = CoroutineScope(Job(

  • Kotlin实现Android系统悬浮窗详解

    目录 Android 弹窗浅谈 系统悬浮窗具体实现 权限申请 代码设计 具体实现 FloatWindowService 类 FloatWindowManager 类 FloatWindowManager 类代码 FloatLayout 类及其 Layout HomeKeyObserverReceiver 类 FloatWindowUtils 类 总结 Android 弹窗浅谈 我们知道 Android 弹窗中,有一类弹窗会在应用之外也显示,这是因为他被申明成了系统弹窗,除此之外还有2类弹窗分别是

  • Kotlin与Java相互调用的完整实例

    目录 一.Kotlin 调用 Java 二.Java 调用 Kotlin 附 Github 源码: 总结 一.Kotlin 调用 Java 1. kotlin 关键字转义 java 中的方法或变量 是 kotlin 的关键字时,使用反引号 `` 对关键字进行转义 // java public class JavaDemo { String is; public String getIs() { return is; } public void setIs(String is) { this.is

  • java协程框架quasar和kotlin中的协程对比分析

    目录 前言 快速体验 添加依赖 添加javaagent 线程VS协程 协程代码 多线程代码 协程完胜 后记 前言 早就听说Go语言开发的服务不用任何架构优化,就可以轻松实现百万级别的qps.这得益于Go语言级别的协程的处理效率.协程不同于线程,线程是操作系统级别的资源,创建线程,调度线程,销毁线程都是重量级别的操作.而且线程的资源有限,在java中大量的不加限制的创建线程非常容易将系统搞垮.接下来要分享的这个开源项目,正是解决了在java中只能使用多线程模型开发高并发应用的窘境,使得java也能

  • Kotlin协程Dispatchers原理示例详解

    目录 前置知识 demo startCoroutineCancellable intercepted()函数 DefaultScheduler中找dispatch函数 Runnable传入 Worker线程执行逻辑 小结 前置知识 Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中.所以从本质上讲,Kotlin和Java是类似的,都是可以编译产生class的语言,但最终还是会受到虚拟机的限制,它们的代码最终会在虚拟机上的某个线程上被执行. 之

  • Kotlin协程启动createCoroutine及创建startCoroutine原理

    目录 createCoroutine 和 startCoroutine startCoroutine调用 createCoroutineUnintercepted intercepted resume 结语 createCoroutine 和 startCoroutine 协程到底是怎么创建和启动的?本篇文章带你揭晓. 在Continuation.kt文件中,有2个基础API,这里单独提出来说一下,方便后面我们理解launch. public fun <T> (suspend () ->

  • java TreeMap源码解析详解

    java TreeMap源码解析详解 在介绍TreeMap之前,我们来了解一种数据结构:排序二叉树.相信学过数据结构的同学知道,这种结构的数据存储形式在查找的时候效率非常高. 如图所示,这种数据结构是以二叉树为基础的,所有的左孩子的value值都是小于根结点的value值的,所有右孩子的value值都是大于根结点的.这样做的好处在于:如果需要按照键值查找数据元素,只要比较当前结点的value值即可(小于当前结点value值的,往左走,否则往右走),这种方式,每次可以减少一半的操作,所以效率比较高

  • IOS身份证识别(OCR源码)详解及实例代码

    IOS身份证识别(OCR源码)详解 最近项目用到身份证识别,在github上搜了一堆demo,在Google上找了一堆代码,有能识别出证件照的,但是都是打包成.a的静态库,没有源码,我努力吃了几天书,有了一点研究成果,现在贴出来与大家分享,要是有更好的方法,希望大神指正,共同探讨解决方案.(以下代码本人亲测可用,正在进一步探索智能识别,如有兴趣,请加入) 这里用到了两个开源库:OpenCV.TesseractOCRiOS,两个语言包chi_sim.eng.身份证识别的流程主要有:灰度化,阀值二值

  • python django事务transaction源码分析详解

    python Django事务 网上关于django1.6的事务资料很多,但是1.8的却搜不到任何资料,自己要用的时候费了不少劲就是不行,现在记下要用的人少走弯路 version:Django 1.8 事务官方文档 事务中文文档里面介绍很多方法,不一一赘述,按照文档即可,下面只分析下atomic方法的源码 按照官方文档 transaction.atomic 有两种用法装饰器和上下文管理器 # atomic() 方法 # from django.db import transaction ####

  • C语言 MD5的源码实例详解

    C语言 MD5源码 md5c.h: /* POINTER defines a generic pointer type */ typedef unsigned char * POINTER; /* UINT2 defines a two byte word */ //typedef unsigned short int UINT2; /* UINT4 defines a four byte word */ typedef unsigned long int UINT4; /* MD5 conte

  • C++ MD5的源码实例详解

    C++ MD5源码: md5.h: #ifndef MD5_H #define MD5_H #include <string> #include <fstream> /* Type define */ typedef unsigned char byte; typedef unsigned int uint32; using std::string; using std::ifstream; /* MD5 declaration. */ class MD5 { public: MD

  • Android通过访问网页查看网页源码实例详解

    Android通过访问网页查看网页源码 1.添加网络权限 <!--访问网络的权限--> <uses-permission android:name="android.permission.INTERNET"/> 2.获取网络中网页的数据 /** * 获取网页HTML源代码 * @param path 网页路径 */ public static String getHtml(String path) throws Exception { URL url=new U

  • 人脸认证源码faceIdentify详解

    本文实例为大家分享了人脸认证源码faceIdentify的具体代码,供大家参考,具体内容如下 人脸认证: using AForge.Video.DirectShow; using face; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using S

  • Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解

    1.Python requests模块说明 requests是使用Apache2 licensed 许可证的HTTP库. 用python编写. 比urllib2模块更简洁. Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码. 在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作. 现代,国际化

  • Kotlin 的注解类详解及实例

    Kotlin 的注解类详解及实例 注解声明 注解是将元数据附加到代码的方法.要声明注解,请将 annotation 修饰符放在类的前面: annotation class Fancy 注解的附加属性可以通过用元注解标注注解类来指定: @Target 指定可以用 该注解标注的元素的可能的类型(类.函数.属性.表达式等): @Retention 指定该注解是否 存储在编译后的 class 文件中,以及它在运行时能否通过反射可见 (默认都是 true): @Repeatable 允许 在单个元素上多次

  • Kotlin 单例实例详解

    Kotlin 单例实例详解 单例的实现方法,可以通过同伴对象,或者 lazy. 示例: class Hello private constructor() { companion object { val instance = Hello() } } 通过 lazy 实现 class Hello private constructor() { private object Holder { val INSTANCE = Hello() } companion object { val insta

随机推荐

其他