协程,纤程(Fiber),或者绿色线程(GreenThread)
纤程(Fiber),或者绿色线程(GreenThread)
面试官:你知道协程吗?
你:订机票的那个吗,我常用。
面试官:行,你先回去吧,到时候电话联系
。。。。。。。。
很尴尬,但是事实是,很大一部分的程序员不知道协程是啥玩意,更大一部分的程序员,项目中没用到协程。
先介绍下协程吧。
计算机有进程,线程和协程。前两者大家都知道,很常见的玩意。而协程,则是基于线程之上的,自主开辟的异步任务,很多人更喜欢叫它们纤程(Fiber),或者绿色线程(GreenThread)。
协程的特点:
- 线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少了上下文切换。
- 线程的默认Stack大小是1M,而协程更轻量,接近1K。因此可以在相同的内存中开启更多的协程。
- 由于在同一个线程上,因此可以避免竞争关系而使用锁。
为什么我会说到协程,这个很多java程序员都没用过的东西。第一、吸引眼球!
好了,言归正传。
是springboot2.0 webflux发布之后,很多人大呼精彩,开始各种比较他与传统selvet性能高低。其实不然,webflux的模式其实和servlet3的模式殊途荣归,都是属于线程委派模式,将业务线程丢给另外的线程池处理来达到业务异步的效果。这样的确能提高某些情况下的吞吐量,但是却不是能达到的理想状态。
为什么这么说,因为我们假如业务线程池设置的最大线程数是1000,那么在核心线程数处理不过来的时候,就会不断的新增线程数直到1000,这样系统中就会出现大量的上下文切换而导致性能损耗。
这里补充一下:CPU线程数代表能同时处理多少线程任务,至于多出来的线程任务,则是CPU根据时间片或阻塞状态不断切换线程来执行,而切换线程的时候,则需要保存当前线程的状态,和恢复要切换的线程状态,这种对性能损耗很大的。
上下文切换的规则是一个线程运行超过5ms,或者出现阻塞,比如IO操作。
而一般像我们CURD程序员的业务操作离不开大量的IO操作(数据库读写),因此,将业务丢在一个线程池中,轮到CPU给你时间片的时候,你立马就告诉CPU:走吧走吧,我还在阻塞呢。 然后让线程立马就切换,可想而知这不是一个理想的操作。同时随着线程的增大,你的内存也不断在增大。
那么这个时候我们该如何处理呢?协程,对了~
协程是怎么来处理的呢,就是对于一个阻塞的业务操作,我们不是用线程来处理,而是用用协程,这样当出现IO阻塞的时候,并且你还没运行完时间片,你不会让CPU跑掉,而是调起你的另一个协程任务,让他继续进行计算。而通常我们知道,代码纯计算执行是非常快的,5ms可能跑了N个方法了,因此这样充分的利用时间片,并且减少CPU切换的时间。
其实在go,以及kotlin中,早已原生支持了协程的概念,所以go以及kotlin的ITer会相对javaer更多的了解协程。
此时javaer欲哭无泪啊。
但是我们真的就不能用协程了吗?虽然java官方还未支持,但是确有第三方支持的,下面给大家介绍下。
Quasar
一个比较成熟的java三方协程库,熟悉之后可用于生产环境。
Alibaba Dragonwell
阿里巴巴开源的发行版jdk,老爸是阿里内部的ajdk,但是目前ajdk的协程还没继承过来,说法是在慢慢继承。
Project Loom
oracle的jvm级项目,重新实现线程模型,里面包含协程方案,目前Quasar作者已经加入。(oracle忙着发JDK呢,这个还在无限延期)
kotlin
kotlin原生支持携程,且也是基于jvm运行的语言并且可以相互调用,可以考虑相互协作。
好了,说了这么多,其实就是一句话,目前现成的像样点的纯种协程框架就只有quasar,混种的就用kotlin吧。至于quasar,会在后续文章中继续介绍。
协程,纤程(Fiber),或者绿色线程(GreenThread)的更多相关文章
- JAVA协程 纤程 与Quasar 框架
ava使用的是系统级线程,也就是说,每次调用new Thread(....).run(),都会在系统层面建立一个新的线程,然鹅新建线程的开销是很大的(每个线程默认情况下会占用1MB的内存空间,当然你愿 ...
- 基于纤程(Fiber)实现C++异步编程库(一):原理及示例
纤程(Fiber)和协程(coroutine)是差不多的概念,也叫做用户级线程或者轻线程之类的.Windows系统提供了一组API用户创建和使用纤程,本文中的库就是基于这组API实现的,所以无法跨平台 ...
- nodejs中的fiber(纤程)库详解
fiber/纤程 在操作系统中,除了进程和线程外,还有一种较少应用的纤程(fiber,也叫协程).纤程常常拿来跟线程做对比,对于操作系统而言,它们都是较轻量级的运行态.通常认为纤程比线程更为轻量,开销 ...
- 第12章 纤程(Fiber)
12.1 纤程对象的介绍 (1)纤程与线程的比较 比较 线程(Thread) 纤程(Fiber) 实现方式 是个内核对象 在用户模式中实现的一种轻量级的线程,是比线程更小的调度单位. 调度方式 由Mi ...
- 纤程(FIBER)
Indy 10 还包含对纤程的支持.纤程是什么?简单来说,它也是 一个“线程”,但是它是由代码控制的,而不是由操作系统控制的.实际上,可以认为线程 是一个高级纤程.纤程和 Unix 用户线程(Unix ...
- Java 中的纤程库 – Quasar
来源:鸟窝, colobu.com/2016/07/14/Java-Fiber-Quasar/ 如有好文章投稿,请点击 → 这里了解详情 最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题: 服 ...
- 纤程与Quasar
Java使用的是系统级线程,也就是说,每次调用new Thread(....).run(),都会在系统层面建立一个新的线程,然鹅新建线程的开销是很大的(每个线程默认情况下会占用1MB的内存空间,当然你 ...
- DELPHI纤程的演示
DELPHI纤程的演示 DELPHI7编译运行通过. 纤程实现单元: unit FiberFun; //Fiber(纤程测试Demo)//2018/04/11//QQ: 287413288 //参考 ...
- 继续了解Java的纤程库 – Quasar
前一篇文章Java中的纤程库 – Quasar中我做了简单的介绍,现在进一步介绍这个纤程库. Quasar还没有得到广泛的应用,搜寻整个github也就pinterest/quasar-thrift这 ...
随机推荐
- 洛谷-p5410-扩展KMP模板
链接: https://www.luogu.org/problem/P5410#submit 题意: 有两个字符串aa,bb,要求输出bb与aa的每一个后缀的最长公共前缀 思路: 扩展kmp模板, 上 ...
- java两个实体公共属性赋值方法
model1 info=new model1();info.setAge("123");info.setCode("1234");info.setName(&q ...
- Babel 转译 class 过程窥探--------引用
// Shape 类function Shape(id, x, y) { this.id = id; this.setLocation(x, y);}// 设置坐标的原型方法Shape.p ...
- mac 建立 .babellrc 格式文件
打开MAC的终端: 1 先sudo -s获取最高权限: 2 然后通过cd进入项目所在的路径: 3 接着“vim .babelrc”新建一个.babelrc 文件: 键盘输入”i“进入编辑模式, ...
- delphi中Tkbmmemtable数据转成SQL脚本
unit UMemtableToSql; interface uses SysUtils, Classes, DB, kbmMemTable, Variants, Dialogs, SuperObje ...
- Codeforces 514 D R2D2 and Droid Army(Trie树)
题目链接 大意是判断所给字符串组中是否存在与查询串仅一字符之差的字符串. 关于字符串查询的题,可以用字典树(Trie树)来解,第一次接触,做个小记.在查询时按题目要求进行查询. 代码: #define ...
- 2016 Multi-University Training Contest 4 部分题解
1001,官方题解是直接dp,首先dp[i]表示到i位置的种类数,它首先应该等于dp[i-1],(假设m是B串的长度)同时,如果(i-m+1)这个位置开始到i这个位置的这一串是和B串相同的,那么dp[ ...
- Android学习_广播接收器
一.广播 1. 标准广播和有序广播 标准广播:异步,发出消息,所有接收器同时接收.但无法被截断 有序广播:同步,同一时刻只有一个广播接收器接收.可截断消息. 2. 广播注册 代码中注册(动态注册).A ...
- C++入门经典-例9.4-默认模板参数
1:默认模板参数就是在类模板定义时设置类型形式参数表中的一个类型参数的默认值,该默认值是一个数据类型.有了默认的数据类型参数后,在定义模板的新类型时就可以不进行指定.代码如下: // 9.4.cpp ...
- IntelliJ IDEA工具增加test测试方法,报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
是因为我在IntelliJ IDEA中,通过plugins增加 插件的时候,在 增加的测试类是junit4.12,改版本的jar包不再包含hamcrest-library.jar .我是通过将自己的项 ...