异步编程实践

异步编程实践

起源:本码农菜鸟实习期间在负责一个小项目时,由于自身经验不足,编写代码过程中不会去着重考虑这个接口甚至于这段程序代码块的效率,在完成基础功能之后也没有查看接口的响应速度,所有业务功能代码都是同步方式。在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数目

猜你喜欢

转载自blog.csdn.net/weixin_47407737/article/details/128894521
今日推荐