zoukankan      html  css  js  c++  java
  • 多线程写excel数据思路

    1背景

      有时候会向excel文件中写入数据,为了提高写入速度,需要向每个sheet页同时写入数据;此时,可以采用多线程的方式同时进行写入,提高效率。

    2思路

      既然需要用到多线程的,那么肯定需要创建多线程的工具、控制多线程的工具。在这里提供这样一类工具:CountDownLatch类、ExecutorService类(这里只是一种方式,当然还有其他的方式)。

    2.1CountDownLatch类

      该类是用来同步多线程处理的类,只有等到每个线程运行完成后,它才会继续后面的流程;打个这样的比方:有十个人在十条跑道上比赛,每一个人占用一条跑道,在终点处有个计数员,他负责的任务是必须要等到10位运动员都跑到终点,他才可以宣布比赛结束,否则整个比赛还在继续进行。这里的CountDownLatch对象就是相当于计数员的角色。它用到的三个方法是:

    • 构造函数:new CountDownLatch(线程个数)。
    • counDown():每个线程结束时都要调用该方法,计数器减一。
    • await():在主线程中调用该方法,一直等到计数器减到为0为止,否则主线程一直暂定在这里。

    2.2ExecutorService类

      可以通过Autowire注解的方式生菜ExecutorService对象,然后通过submit方法来启动一个线程,大致写法如下:

    @Autowire
    private ExecutorService executorService;
    
    
    public void test() {
        executorService.submit(()->{
           // Todo  具体的逻辑实现
       })
    }

    2.3StopWatch类

      这个类是一个用来分析任务耗时的工具类,非常直观、简洁;使用起来也很简单,大致如下:

    StopWatch stopWatch = new StopWatch(Thread.currentThread().getStackTrace()[1].getMethodName());
    stopWatch.start(“taskName”);
    // Todo 执行具体的任务
    stopsWatch.stop();

      数据分析示例:

    ----------------------------------------------
    ns             %            Task name
    3623048300    028%            test2
    114789400     010%            test1
    9120146000    071%            test3
    ----------------------------------------------
    • ns:时间单位,纳秒
    • %:任务耗时占比,值越大,耗时越长
    • Task name:任务名称

    3小结

      上文只是提到在遇到写excel时需要同时写入数据的实现思路,仅供参考。

    阅读是一种修养,分享是一种美德。
  • 相关阅读:
    开源.net 混淆器ConfuserEx介绍
    k8s删除namespace失败,状态Terminating解决方案
    java get all threadlocal from thread
    mysql查看索引的大小
    InnoDB一定会在索引中加上主键吗?
    全链路追踪traceId,ThreadLocal与ExecutorService
    redis 批量删除keys
    shell逐行读取excel并执行sql
    Is it possible to create @Around Aspect for feign.Client
    Spring Boot后台启动不打印nohup.out
  • 原文地址:https://www.cnblogs.com/bien94/p/15700397.html
Copyright © 2011-2022 走看看