java基于quasar实现协程池【前篇】:java基于quasar实现协程池_爪哇盘古的博客-CSDN博客

在上一个文章中讲述了通过仿照java自写线程池的方式改写成quasar协程池,功能可以说实现了效果,但是遇到了一个烦恼就是在协程阻塞过程中会疯狂报警告,如果您的项目有日志文件产生当遇到一个非常耗时的任务时后面的任务阻塞产生警告,那么该日志文件的体量是致命的!所以为了摆脱这个问题,不要尝试、不要猜。要看文档!【我对英文很不友好的】

quasar纤程文档:FiberExecutorScheduler (Quasar 0.8.0)

在该文档中我发现了FiberExecutorScheduler类,这个类将是本文阐述quasar协程池的正确打开方式!【全是泪】

分析经历:我一直对Quasar及其轻质纤维替代Threads感到好奇。那么quasar本身是否有自己的纤程池呢?于是看是翻阅文档,找吧挨个看吧!

线程池ThreadPoolExecutor类的实现。

int maxThreadPoolSize = 10;ThreadPoolExecutor executor = new ThreadPoolExecutor(maxThreadPoolSize,maxThreadPoolSize,10, TimeUnit.MINUTES,new ArrayBlockingQueue<Runnable>(maxThreadPoolSize),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy()
);for (int i = 0; i < 100; i++) {executor.execute(new Runnable() {@Overridepublic void run() {// run some code}});
}

上面的代码创建了一个具有10个线程的池,一个在池前的队列(该队列可以容纳10个元素)和一个拒绝策略(当队列已满时),以使主线程自己执行Runnable任务。当for循环创建100个可运行对象时,它们将在池中一次执行10个,排队等待10个,并且主线程自己拾取一个Runnable直到其他对象完成,然后主线程返回将Runnables添加到执行程序。

每个光纤调度器调度的光纤,当您创建不带调度器的光纤时,将创建一个FiberForkJoinScheduler并将其分配给该光纤。

简而言之,如果要管理线程池中的光纤,请使用FiberExecutorScheduler
Quasar关于调度光纤的文档

您的代码可能像这样

        //线程池任务数量int maxThreadPoolSize = 10;ThreadPoolExecutor executor = new ThreadPoolExecutor(maxThreadPoolSize,maxThreadPoolSize,10, TimeUnit.MINUTES,new ArrayBlockingQueue<Runnable>(maxThreadPoolSize),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());//重点!通过FiberExecutorScheduler类将线程池传为协程池FiberExecutorScheduler scheduler = new FiberExecutorScheduler("FibersInAPool", executor);for (int i = 0; i < 100; i++) {int finalI = i;Fiber fiber = new Fiber<>(scheduler, new SuspendableRunnable() {@Overridepublic void run() throws SuspendExecution, InterruptedException {// run some codeSystem.out.println(finalI);Thread.sleep(1000);}});fiber.start();}

这个操作看着可能会很奇怪,一个纤程池干嘛要利用线程池来加载使用?这可能与java底层本身不支持协程有关吧【猜】,不过通过这种形式也有好处就是可以直接通过开始的线程池的一些功能。方便了使用习惯(无非就是创建个线程池通过FiberExecutorScheduler来改为协程池进行协程操作),这样对于springboot的bean也会更友好的实现了吧!毕竟是通过线程池创建bean!

以下是实现效果:

不会出现阻塞警告了

光纤非常便宜,因此您根本不需要池(及其异步作业调度模型):只需启动光纤,并在每次需要新的顺序进程与其他进程同时运行时让其运行常规顺序代码即可。

当然它也支持类似go的管道【看文档】,可以自行开发你的业务逻辑。

Channel (Quasar 0.8.0)

package testgrp;import java.util.concurrent.ExecutionException;import co.paralleluniverse.strands.SuspendableCallable;
import co.paralleluniverse.strands.SuspendableRunnable;
import co.paralleluniverse.strands.channels.Channels;
import co.paralleluniverse.strands.channels.IntChannel;import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.fibers.SuspendExecution;/*** Increasing-Echo Quasar Example** @author circlespainter*/
public class QuasarIncreasingEchoApp {static public Integer doAll() throws ExecutionException, InterruptedException {final IntChannel increasingToEcho = Channels.newIntChannel(0); // Synchronizing channel (buffer = 0)final IntChannel echoToIncreasing = Channels.newIntChannel(0); // Synchronizing channel (buffer = 0)Fiber<Integer> increasing = new Fiber<>("INCREASER", new SuspendableCallable<Integer>() { @Override public Integer run() throws SuspendExecution, InterruptedException {// The following is enough to test instrumentation of synchronizing methods// synchronized(new Object()) {}int curr = 0;for (int i = 0; i < 10 ; i++) {Fiber.sleep(10);System.out.println("INCREASER sending: " + curr);increasingToEcho.send(curr);curr = echoToIncreasing.receive();System.out.println("INCREASER received: " + curr);curr++;System.out.println("INCREASER now: " + curr);}System.out.println("INCREASER closing channel and exiting");increasingToEcho.close();return curr;} }).start();Fiber<Void> echo = new Fiber<Void>("ECHO", new SuspendableRunnable() { @Override public void run() throws SuspendExecution, InterruptedException {Integer curr;while (true) {Fiber.sleep(1000);curr = increasingToEcho.receive();System.out.println("ECHO received: " + curr);if (curr != null) {System.out.println("ECHO sending: " + curr);echoToIncreasing.send(curr);} else {System.out.println("ECHO detected closed channel, closing and exiting");echoToIncreasing.close();return;}}} }).start();try {increasing.join();echo.join();} catch (ExecutionException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}return increasing.get();}static public void main(String[] args) throws ExecutionException, InterruptedException {doAll();}
}

我们大java真是无所不能,通过这次实践也是让我倍感骄傲!以后谁也别说什么java不支持协程了~

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

java基于quasar实现协程池【后篇】相关推荐

  1. java基于quasar实现协程池

    业务场景:golang与swoole都拥抱了协程,在同任务并发数量下,协程可比线程多几倍.所以最近在查询java时了解java本身是没有协程的,但是某牛自行实现了协程,也就是本文的主角quasar(纤 ...

  2. 白话 Golang 协程池

    文章目录 1.何为并发 2.并发的好处 3.Go 如何并发 4.G-P-M 调度模型 5.Go 程的代价 6.协程池的作用 7.简易协程池的设计&实现 8.开源协程池的使用 9.小结 参考文献 ...

  3. 一期每日一GO群分享-flag、viper、协程池、异常处理

    1.11 flag库 今天介绍一个库flag,命令行程序常用,用来接受参数的. var (intflag intboolflag boolstringflag string )func init() ...

  4. 连接池和协程池为何能提升并发能力?

    你有没有发现,"内存池"和"进程池"都带有"池"字?其实,这两种技术都属于"池化技术".它通常是由系统预先分配一批资源并 ...

  5. Golang并发模型:轻松入门协程池

    goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...

  6. golang协程池设计

    https://segmentfault.com/a/1190000018193161 Why Pool go自从出生就身带"高并发"的标签,其并发编程就是由groutine实现的 ...

  7. Go语言 有缓冲通道、协程池

    文章目录 导言 有缓冲通道.线程池 有缓冲通道是什么? 例子 另一个例子 死锁 容量 vs 长度 WaitGroup 实现协程池 1. 创建数据结构 2. 创建相关函数 1. `digits`函数 2 ...

  8. Java高并发系列5-线程池

    Java高并发系列5-线程池 接上一篇Java并发系列4-并发容器我们继续 在编程中经常会使用线程来异步处理任务,但是每个线程的创建和销毁都需要一定的开销.如果每次执行一个任务都需要开个新线程去执行, ...

  9. go 协程池 ants库分析

    简介 相比于创建多个线程,goroutine 更轻量.资源占用更少.切换速度更快.无线程上下文切换开销更少.但是受限于资源总量,系统中能够创建的 goroutine 数量也是受限的.默认每个 goro ...

最新文章

  1. 东田纳西州立大学计算机排名,2019东田纳西州立大学世界排名
  2. 看 nova-scheduler 如何选择计算节点 - 每天5分钟玩转 OpenStack(27)
  3. jquery中文参考文档
  4. 326. Power of Three
  5. 动态规划——01背包问题
  6. 【Linux】一步一步学Linux——pgrep命令(123)
  7. java map 输入 查询 修改_map的查询和修改方法
  8. bz2解压命令_Java压缩技术 - tar.bz2解压缩
  9. 分块-洛谷P3203 [HNOI2010]BOUNCE 弹飞绵羊
  10. 浅谈百度云计算网络的构建之路
  11. AS3 BitmapData中获取非透明区域对应矩阵
  12. LabView学习笔记(八):属性节点
  13. SVN客户端下载和Svn visual studio插件
  14. 大气层整合傻瓜包_【工具】switch大气层9.2系统升级固件+大气层0.10.3离线整合包...
  15. apache设置开机启动启动
  16. j1900 nas安装windows蓝屏,无网卡连不上网
  17. c++学习笔记:黑客攻击系统-功能菜单
  18. 谷歌浏览器网页翻译插件
  19. 英特尔多核平台编码优化大赛就顺便试试身手了
  20. VS2019 莫名其妙出现: C2059 语法错误:“}“,C2143 语法错误:缺少“;“(在“}“的前面),C2065 未定义标识符,C2039 不是““的成员等

热门文章

  1. 【LeetCode】934. 最短的桥
  2. 50Projects--Blurry Loading
  3. 4.2 Pollard p-1算法
  4. 各类稀奇好用的网站,你值得拥有!
  5. Linux,grep命令,在大日志文件中搜索关键字 最后/最开始出现位置
  6. 编写函数long fun(int high,int n),功能是:计算并返回high以内(不包含high)最大的n个素数之和。若不足n个,则到最小素数2为止。例如:若high=100,n=10,则函数
  7. python 打印乘法表各种形式_Python使用while循环花式打印乘法表
  8. 云服务器系统一键安装,一键安装服务器系统
  9. Idea使用Alibaba Cloud Toolkit实现一键部署项目到linux环境
  10. 使用word写论文必备技巧(设置目录,目录导航)