Kilim框架
Kilim 框架在实现这个语义特性时干了以下几个事情:
- 利用字节码技术,将普通代码转换为支持协程的代码
- 调用Pasueable方法的时候,如果暂停了就保存当前方法栈的State,暂停执行当前Task,将控制权交给Scheduler调度器
- Scheduler 调度器负责协调其他就绪的Task
- 之前暂停的Task恢复的时候,自动恢复State,恢复到上次执行的位置继续执行
其中第一点是在编译期实现,其他点是在运行期实现
Kilim的工作原理
第一个Kilim最神奇的地方在于字节码增加,那么它是怎么样将普通的Java代码改写成支持协程的代码;
这也是Kilim实现协程的精髓所在。
左边是普通的java函数代码,与我们常见的函数唯一有所不同的是函数a和b均显示声明抛出Pausable异常,而实际上这个异常在运行期间不会抛出,他的实际作用类似于竹注解,使得Kimil能够识别哪些代码需要Weaver工具进行代码增强。函数抛出Pasuable异常即表明该函数是可暂停的。
右边的代码即通过字节码增强后的代码,与左边的原始代码相比,首先函数声明中增加了一个Fiber参数,Fiber可以理解为当前纤维
程/协程的上下文。Fiber中存储着协程暂停和恢复时需要用到的函数堆栈。程序计数器以及当前函数的执行状态。字节码增强后的代码以调用Pasuable方法a为分界,将整