在Java里体验一把协程Quasar

在还没有协程的时代

操作系统产生一个进程,进程再产生若干个线程并行的处理逻辑,线程的切换由操作系统负责调度。每个线程都有自己的栈

所以指望一个进程开启上万个线程是不现实的。但是实际上我们也不会这么干,因为起这么多线程并不能充分的利用CPU,大部分线程处于等待状态,CPU也没有这么核让线程使用。所以一般线程数目都是CPU的核数。

传统的J2EE系统都是基于每个请求占用一个线程去完成完整的业务逻辑(包括事务)。所以系统的吞吐能力取决于每个线程的操作耗时。如果遇到很耗时的I/O行为,则整个系统的吞吐立刻下降,比如JDBC是同步阻塞的,这也是为什么很多人都说数据库是瓶颈的原因。这里的耗时其实是让CPU一直在等待I/O返回,说白了线程根本没有利用CPU去做运算,而是处于空转状态。暴殄天物啊。另外过多的线程,也会带来更多的ContextSwitch开销。

点评:JDK中有了线程,允许一定的并发处理,而且有封装很好的ThreadPool,可以用来管理大量的线程生命周期,但是本质上还是不能很好的解决线程数量的问题,以及线程空转占用CPU资源的问题。

为了解决同步阻塞时线程空转占用CPU资源的问题,行业早期流行的解决方案之一就是单线程加上异步回调。遇到需要进行I/O操作的地方,就直接让出CPU资源,然后注册一个回调函数,其他逻辑则继续往下走,I/O结束后带着结果向事件队列里插入执行结果,然后由事件调度器调度回调函数,传入结果。

点评:为了保存之前的栈上数据,你要么选择带着一起放入回调函数里,要么就不停的嵌套,从而引起反人类的Callback hell。而且业务逻辑上也有一定的割裂

协程应运而生

目前JDK原生是不支持协程的,一直被go工程师鄙视,Java工程师苦协程久已,大师puniverse看不下去了,基于字节码技术搞了一个Quasar来支持协程,目前一直在更新维护

基于Quasar的第一个协程示例

1.添加pom依赖
    
co.paralleluniverse
quasar-core
0.7.9
jdk8

2.测试代码
public static void main(String[] args) throws Exception {
//使用阻塞队列来获取结果。
LinkedBlockingQueue<Fiber> fiberQueue = new LinkedBlockingQueue<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);
for (int i = 0; i < 100; i++) {
int finalI = i;
//这里的Fiber有点像Callable,可以返回数据
Fiber fiber = new Fiber<>((SuspendableCallable) () -> {
//这里用于测试内存占用量
Fiber.sleep(1000);
System.out.println(“in-” + finalI + “-” + LocalDateTime.now().format(formatter));
return finalI;
});
//开始执行
fiber.start();
//加入队列
fiberQueue.add(fiber);
}
while (true) {
//阻塞
Fiber fiber = fiberQueue.take();
System.out.println(“out-” + fiber.get() + “-” + LocalDateTime.now().format(formatter));
}
}

3.测试运行
启动时需要指定javaagent -javaagent:${ $path/quasar-core.jar} ,其它的跟普通java程序没啥区别

运行日志
ForkJoinPool-default-fiber-pool-worker-1-in-0-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-4-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-3-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-1-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-6-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-2-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-9-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-12-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-13-2019-09-19 19:23:19
main-out-0-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-5-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-7-2019-09-19 19:23:19
main-out-1-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-17-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-18-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-16-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-15-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-21-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-14-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-22-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-24-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-8-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-10-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-26-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-11-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-28-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-29-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-30-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-27-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-32-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-34-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-35-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-25-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-37-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-36-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-23-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-19-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-20-2019-09-19 19:23:19
main-out-2-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-42-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-41-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-40-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-45-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-39-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-38-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-33-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-31-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-49-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-48-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-47-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-46-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-54-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-56-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-57-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-58-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-59-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-60-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-61-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-44-2019-09-19 19:23:19
main-out-3-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-43-2019-09-19 19:23:19
main-out-4-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-63-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-62-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-55-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-53-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-52-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-51-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-69-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-50-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-70-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-67-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-73-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-68-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-74-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-75-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-65-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-77-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-66-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-79-2019-09-19 19:23:19
main-out-5-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-80-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-64-2019-09-19 19:23:19
main-out-6-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-81-2019-09-19 19:23:19
main-out-7-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-82-2019-09-19 19:23:19
main-out-8-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-78-2019-09-19 19:23:19
main-out-9-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-76-2019-09-19 19:23:19
main-out-10-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-72-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-71-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-88-2019-09-19 19:23:19
main-out-11-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-87-2019-09-19 19:23:19
main-out-12-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-86-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-85-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-84-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-93-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-83-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-95-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-96-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-98-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-94-2019-09-19 19:23:19
main-out-13-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-92-2019-09-19 19:23:19
main-out-14-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-91-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-90-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-89-2019-09-19 19:23:19
main-out-15-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-99-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-97-2019-09-19 19:23:19
main-out-16-2019-09-19 19:23:19
main-out-17-2019-09-19 19:23:19
main-out-18-2019-09-19 19:23:19
main-out-19-2019-09-19 19:23:19
main-out-20-2019-09-19 19:23:19
main-out-21-2019-09-19 19:23:19
main-out-22-2019-09-19 19:23:19
main-out-23-2019-09-19 19:23:19
main-out-24-2019-09-19 19:23:19
main-out-25-2019-09-19 19:23:19
main-out-26-2019-09-19 19:23:19
main-out-27-2019-09-19 19:23:19
main-out-28-2019-09-19 19:23:19
main-out-29-2019-09-19 19:23:19
main-out-30-2019-09-19 19:23:19
main-out-31-2019-09-19 19:23:19
main-out-32-2019-09-19 19:23:19
main-out-33-2019-09-19 19:23:19
main-out-34-2019-09-19 19:23:19
main-out-35-2019-09-19 19:23:19
main-out-36-2019-09-19 19:23:19
main-out-37-2019-09-19 19:23:19
main-out-38-2019-09-19 19:23:19
main-out-39-2019-09-19 19:23:19
main-out-40-2019-09-19 19:23:19
main-out-41-2019-09-19 19:23:19
main-out-42-2019-09-19 19:23:19
main-out-43-2019-09-19 19:23:19
main-out-44-2019-09-19 19:23:19
main-out-45-2019-09-19 19:23:19
main-out-46-2019-09-19 19:23:19
main-out-47-2019-09-19 19:23:19
main-out-48-2019-09-19 19:23:19
main-out-49-2019-09-19 19:23:19
main-out-50-2019-09-19 19:23:19
main-out-51-2019-09-19 19:23:19
main-out-52-2019-09-19 19:23:19
main-out-53-2019-09-19 19:23:19
main-out-54-2019-09-19 19:23:19
main-out-55-2019-09-19 19:23:19
main-out-56-2019-09-19 19:23:19
main-out-57-2019-09-19 19:23:19
main-out-58-2019-09-19 19:23:19
main-out-59-2019-09-19 19:23:19
main-out-60-2019-09-19 19:23:19
main-out-61-2019-09-19 19:23:19
main-out-62-2019-09-19 19:23:19
main-out-63-2019-09-19 19:23:19
main-out-64-2019-09-19 19:23:19
main-out-65-2019-09-19 19:23:19
main-out-66-2019-09-19 19:23:19
main-out-67-2019-09-19 19:23:19
main-out-68-2019-09-19 19:23:19
main-out-69-2019-09-19 19:23:19
main-out-70-2019-09-19 19:23:19
main-out-71-2019-09-19 19:23:19
main-out-72-2019-09-19 19:23:19
main-out-73-2019-09-19 19:23:19
main-out-74-2019-09-19 19:23:19
main-out-75-2019-09-19 19:23:19
main-out-76-2019-09-19 19:23:19
main-out-77-2019-09-19 19:23:19
main-out-78-2019-09-19 19:23:19
main-out-79-2019-09-19 19:23:19
main-out-80-2019-09-19 19:23:19
main-out-81-2019-09-19 19:23:19
main-out-82-2019-09-19 19:23:19
main-out-83-2019-09-19 19:23:19
main-out-84-2019-09-19 19:23:19
main-out-85-2019-09-19 19:23:19
main-out-86-2019-09-19 19:23:19
main-out-87-2019-09-19 19:23:19
main-out-88-2019-09-19 19:23:19
main-out-89-2019-09-19 19:23:19
main-out-90-2019-09-19 19:23:19
main-out-91-2019-09-19 19:23:19
main-out-92-2019-09-19 19:23:19
main-out-93-2019-09-19 19:23:19
main-out-94-2019-09-19 19:23:19
main-out-95-2019-09-19 19:23:19
main-out-96-2019-09-19 19:23:19
main-out-97-2019-09-19 19:23:19
main-out-98-2019-09-19 19:23:19
main-out-99-2019-09-19 19:23:19

Quasar原理剖析

https://blog.csdn.net/guzhangyu12345/article/details/84666423
https://segmentfault.com/a/1190000006079389

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章