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时需要同时写入数据的实现思路,仅供参考。

阅读是一种修养,分享是一种美德。