当前位置: 首页 > news >正文

异步编程实践

异步编程实践

起源:本码农菜鸟实习期间在负责一个小项目时,由于自身经验不足,编写代码过程中不会去着重考虑这个接口甚至于这段程序代码块的效率,在完成基础功能之后也没有查看接口的响应速度,所有业务功能代码都是同步方式。在mentor说明以及帮助情况下,使用arthas去测试接口响应主要耗时点

arthas 简单使用

1、下载arthas jar包,idea安装arthas插件
2、启动所测试的程序
3、在jar包的目录下 执行 java - jar arthas-boot.jar (jar包文件全称),会出现目前所允许的程序进程,输入你所要测试的进程的符号标识之后enter键,等待运行完毕;在所需要测试耗时点的代码块,点击右键,点击trace(这是一个获取相关命令并复制的过程)
4、按ctr v粘贴出现刚刚获取到的命令行,点击enter键;而后可以通过postman、jmeter等接口测试工具去发起,所在窗口会出现耗时时长,及每个耗时点

同步改异步

在获取得到耗时点之后,发现很多代码实际上应使用异步来解决。笔者认为异步编程其实就是在当前线程中,产生新的任务让新的线程去执行

  • 针对于业务层方法:SpringBoot注解
    在所需要异步的service层 加上@async注解,在启动加上@EnableAsync
  • 针对于代码块或者非service层的方法,可以通过线程池方式
    如以下例子:executor是你所定义的线程池
//转换为多个任务,交由线程池executor去完成
CompletableFuture<Void> CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    System.out.println(finalI + "ThreadId :" + Thread.currentThread().getId());
}, executor);
futures.add(future);
//实现异步改同步,这里会等待所有任务执行完才会接着执行下一步
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();


//同步改异步 再改同步
CountDownLatch latch = new CountDownLatch(2);
        executor.execute(() -> {
            latch.countDown();
        });

        executor.execute(() ->{
             latch.countDown();
        });
        latch.await();

对于线程池的定义,七大参数简单解释如下
在这里插入图片描述

但对于线程池的参数设置,笔者还不是很有经验,只能通过网上搜索得到以下结论,实际开发还是需要自己去实践

  • 如果是CPU密集型应用,则线程池大小设置为N+1
  • 如果是IO密集型应用,则线程池大小设置为2N+1
    N是CPU核数

IO优化中, 最佳线程数目 = ((线程等待时间+线程CPU时间) / 线程CPU时间) * CPU数目
线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程
比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,((0.5+1.5)/0.5)*8=32,进一步转化为: 最佳线程数目 = ( 线程等待时间与线程CPU时间之比 + 1 )* CPU数目

相关文章:

  • Go XORM学习
  • 【golang/go语言】go语言中包的使用、Init()函数、协程和接口
  • 【电源专题】JEITA学习
  • cadence SPB17.4 S032 - PSpice - 仿真元件参数的含义 - 以VSIN为例
  • 印刷线路板焊盘和金手指自动光学检测研究
  • 算法刷题打卡第81天:兼具大小写的最好英文字母
  • 【MySQL】MyCAT三大配置文件详解(MySQL专栏启动)
  • go-zero源码阅读-布隆过滤器
  • 数组试题(Python实现)
  • PHP 杂项 函数
  • Mybatis持久层框架 | CRUD
  • 内网渗透(八)之基础知识-企业域中计算机分类和专业名
  • Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏
  • 周赛331总结
  • SSM整合知识点记录
  • 设计模式-模板方法模式
  • MySQL数据库01——mysql的安装和配置(包含workbench安装,超详细)
  • 2/4考试总结
  • Ta-Lib源码解析(三):蜡烛图指标 (Candlestick Indicator) #(附Python重构代码和示意图)(补充中)
  • 【嵌入式】MDK使用sct文件将代码段放入RAM中执行
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉