乐趣区

关于java:神秘使者到Java帝国传道协程竟被轰了出去

以下文章来源于编程技术宇宙,作者轩辕之风 O

神秘使者

“久闻 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,一时朝野触动。

退出移动版