神秘使者到 Java 帝国传道协程,竟被轰了出去!
作者 | 轩辕之风O
来源 | 编程技术宇宙(ID:xuanyuancoding)
头图 | CSDN 下载自东方IC
神秘使者
“久闻Java语言跨越平台,框架众多,不过二十年功夫,就已晋升天下第一编程语言,今日一见,果然名不虚传呐!”
“使者先生您过奖了,咱们快些走,国王陛下已经等候多时了”
今日,Java帝国朝堂之上迎来了一位神秘的来宾。
来到大殿之上,只见国王正襟危坐,闭目养神,不怒自威,堂下群臣咸集,纷纷侧目。
“来者何人?”,国王一旁的内侍问到。
“我乃GoLang帝国使者——Goroutine”,使者答道。
“GoLang帝国?何方番邦小国?寡人竟从未听闻”,国王闭眼说到。
说罢,群臣皆笑了起来。
“来此所为何事?”,内侍继续问到。
使者回答:“我此行特为传道而来”
说完,国王睁开了眼睛,“传道?我Java帝国乃天下第一编程帝国,只有我们传出去,哪有学别人之道?”
使者不卑不亢,说到:“Java帝国虽如日中天,但却有一处缺陷,假以时日,必成大患”
“哦,你倒是说说看,如若言语不通,即刻轰出殿去。”,国王厉声喝到。
“敢问陛下,Java线程执行到阻塞函数时,该当如何?”,使者问到。
一旁的线程大臣见状,上前说到:“遇到阻塞那自然要被操作系统挂起,切换到别的线程”
“敢问大人,线程切换是否需要成本?如果大量线程频繁切换,成本又当如何?”,使者追问到。
“你若关心这个问题,那就不用阻塞函数,通过异步回调来进行”,线程大臣答道。
使者嘴角上扬,微微一笑,“好一个异步回调!异步回调确实不用阻塞,不过它有两宗罪,其一:割裂了原来的代码业务逻辑,其二:陷入回调地狱难以维护”
“这也不行,那也不行,你这人还真难伺候”,线程大臣有些急了。
使者转身面向国王说到:“启禀陛下,我有一法,可让线程遇到阻塞函数后不需切换线程,也不用异步回调还可以继续运行下去,是高并发开发神技”
国王一听来了兴趣:“哦,还有这种事?说来听听”
使者拜了一拜,说到:“线程可以在遇到阻塞的地方后,保存执行的上下文,转而去执行别处的代码。待阻塞的请求完成后,再转而回去继续执行”
国王不解,问到:“什么叫转而去执行别处的代码?什么叫回去继续执行?这函数执行到一半还能中途退出再回来?”
“是的,没错!”,使者回答。
此话一出,朝堂上议论纷纷,群臣都露出了鄙夷的笑容。
“简直荒谬!函数执行从进入到return退出,从来都是一气呵成,哪有中途执行一半退出,再回来接着执行的道理?简直闻所未闻!”,一旁的线程大臣说到。
使者继续说到:“一气呵成?恐怕不是吧?线程执行函数中途,遇到时间片用完或者遇到I/O阻塞,就会被操作系统保存上下文后挂起,切换到其他线程。而后等到机会再回过头继续执行,不是吗?”
线程大臣怒斥道:“强词夺理!你说的这情况是操作系统在调度管理多个线程,对咱们的应用层线程来说都是透明的,无需关心”
使者没有退让,却问道:“既然操作系统可以调度管理多个线程,那为何线程不可以调度管理函数的执行?”
群臣再次交头接耳,议论起来。
“陛下,此番邦使者妖言惑众,微臣建议即刻逐出大殿,以正视听!”
国王应允,随即遣人上前。
不待侍卫上前,使者自行离去,边走边说到:“可叹!堂堂Java帝国,却容不下一个新技术”
临别相会
使者心灰意冷,打算离开Java帝国,却在半道上被人给拦了下来。
“先生请留步,我家主人请先生府上相会”
使者来到府上,原来主人乃当地一富豪乡绅。
“先生今日在朝堂之事,我已听说,在下对先生提到的函数执行过程中可中断和恢复的技术颇有兴趣,还请先生不吝赐教”,主人说完拜了一拜。
“赐教不敢当,我此次来Java帝国,所传之道名叫协程,是一种高并发开发的绝技,可无奈贵国国君与大臣皆不识货,无功而返,可惜啊,可惜!”,使者叹息到。
“协程?这是何物?我只听说过进程和线程,却是从未听过协程”
使者起身说到:“线程是操作系统抽象出来的执行流,由操作系统统一调度管理。那在一个线程中,同样可以抽象出多个执行流,由线程来统一调度管理。这线程之上抽象的执行流就是协程”
主人有些不解,问到:“一个线程怎么会有多个执行流呢?”
“这便是我今日在朝堂上说的,线程执行函数遇到阻塞后,可以保存上下文后退出,转而执行别处的代码,这里就从一个执行流转向了另外的执行流”,使者解释到。
主人拍案而起,“原来是这个意思,妙哉,妙哉啊!不过,这线程是操作系统在调度管理,那线程里抽象出来的执行流,也就是协程,该怎么调度管理呢?操作系统可以通过时钟中断和系统调用进入内核来剥夺线程的执行权,那线程该如何剥夺协程的执行权来实现调度管理呢?”
“真是个好问题!线程的调度由操作系统来管理,是抢占式调度。而协程不同,协程需要互相配合,主动交出执行权,这也是协程的名字——协作式程序的来历”
“主动交出执行权?如何办到?”,主人追问。
“办法有很多,比如C++帝国有一协程框架,名叫libco,他通过HOOK关键的系统函数来实现调度器的介入”
“那你们Golang是怎么做的?也是这样吗?”
“我们Golang帝国可不一样,我们先天设计就是支持协程,系统调用都被我们封装好了,应用程序调用时遇到需要阻塞的,像是文件读写Read/Write、Sleep我们的调度器就能有机会介入,去执行调度管理了”,使者得意的说到。
主人思考片刻,问到:“那我们Java该如何实现呢,还请先生赐教”
“你们Java语言,是通过JVM在执行,字节码的执行都在JVM的掌控之中,要想实现对应用代码执行流的中断和恢复还不是易如反掌?”,使者说到。
主人点了点头,若有所思。
新的征程
主人与使者交谈甚欢,不知不觉已近黄昏。
主人起身说到:“今蒙先生赐教,大慰平生。还请先生在府上多留时日,我好细细请教。”
使者连连挥手,说到:“我还有要事在身,明日就要离去”
“不知先生欲往何处?”
“听说C++帝国又要发布新版本,我打算前往传道”
主人面露疑惑:“C++帝国不是有libco了吗?”
“libco终究不是朝廷之物,此番前去,希望可以让协程纳入新的官方标准”
翌日清晨,使者拜别主人,策马离去。
不久,Java帝国朝堂上传来消息,民间有人推出了协程框架——Quasar,一时朝野震动。
更多精彩推荐
☞什么才是真正的程序员?
☞求伯君领衔 5 代技术人对话,00 后浪来袭 1024 程序员节
☞国行 iPhone 12/Pro/Max双卡模式支持5G网络;支付宝推出「晚点付」功能;MySQL 8.0.22 GA|极客头条
☞强化学习是针对优化数据的监督学习?
☞对话阿里云:开源与自研如何共处?
☞10 月中旬的 Medalla 测试网失常:如何开始,将如何结束?
点分享点点赞点在看
神秘使者到 Java 帝国传道协程,竟被轰了出去!相关推荐
- 神秘使者到Java帝国传道协程,竟被轰了出去
作者 | 轩辕之风O 来源 | 编程技术宇宙(ID:xuanyuancoding) 头图 | CSDN 下载自东方IC 神秘使者 "久闻Java语言跨越平台,框架众多,不过二十年功夫,就已 ...
- Java编程:Java里的协程
今天看到这篇博客记录一下,后面有时间来研究一下协程看能不能对现在的项目有所提高 转次时代Java编程(一):Java里的协程_zdy0_2004的博客-CSDN博客 这东西其实有很多名词,比如有的人喜 ...
- 协程和线程的区别、协程原理与优缺点分析、在Java中使用协程
文章目录 什么是协程 协程的优点与缺点 协程实现原理. 协程与线程在不同编程语言的实现 在Java中使用协程 Kilim介绍 Kilim整合Java,使用举例 小总结 什么是协程 相对于协程,你可能对 ...
- 橘子学java之java中的协程
一.关于协程 最近jdk19上了,java开始支持虚拟线程了,也就是所谓的协程,java的协程库是官方是这个https://openjdk.org/projects/loom/.我指的是oracle的 ...
- java协程_在Java中使用协程(Coroutine)
各种语言在实现Coroutine方式的支持时,多数都采用了Actor Model来实现,Actor Model简单来说就是每个任务就是一个Actor,Actor之间通过消息传递的方式来进行交互,而不采 ...
- 洗料系列-编程语言专题-Java 19【线程×,协程√】
一.进程.线程 表1. 进程.线程.协程一览 概念 调度 创建和切换代价 组成 备注 进程 操作系统 极高 资源分配的最小单位 线程 操作系统 高 进程的组成部分 CPU调度和执行的最小单位 协程 ...
- java基于quasar实现协程池【后篇】
java基于quasar实现协程池[前篇]:java基于quasar实现协程池_爪哇盘古的博客-CSDN博客 在上一个文章中讲述了通过仿照java自写线程池的方式改写成quasar协程池,功能可以说实 ...
- Java Fork/Join与协程
一.概览 Fork/Join并行方式是获取良好的并行计算性能的一种最简单同时也是最有效的设计技术.Fork/Join并行算法是我们所熟悉的分治算法的并行版本,典型的用法如下: Result solve ...
- JAVA 协程Quasar初探
这里写自定义目录标题 什么是协程 java 携程框架Quasar Quasar VS Golang Quasar 初探 协程原理 什么是协程 计算机有进程,线程和协程.前两者大家都知道,很常见的玩意. ...
最新文章
- hbase把表删除后又新建该表提示表已存在,解决方案
- 活动助手Beta用户试用报告
- 4月02日 提取汉字首字母,并大写的类
- 在Java里重写equals和hashCode要注意什么问题
- PHP倒序后五个字符串,并显示
- 10个Python实战编程项目,有趣又好玩
- 思考的救赎(一):三消游戏实现探索
- 深入理解Redis跳跃表的基本实现和特性
- Underexposed Photo Enhancement using Deep Illumination Estimation阅读札记
- win11 自带远程桌面使用(包含非局域网使用以及win11升级为专业版)
- 13 新品种:导弹发射器 (和儿子一起编游戏-塔防系列 )
- 郭逸淵:4月6日比特幣(BTC)以太坊(ETH)行情分析及布局思路
- 旁路电容和去耦电容基础知识
- 解决微信公众号获取用户信息报48001错误
- win7右下角网路图标不见了,将这个操作删除掉就行了
- 如何看计算机cpu的好坏,怎么看电脑的配置(如何判断cpu的好坏)
- lammps案例:空位形成能的模拟与计算
- 如何实现flex栅格布局及合并单元格
- MarkDown简介(深度解析MarkDown用法)
- 推荐系统(蒋凡译)— 第三章 基于内容的推荐