项目场景:
导出用户推广数据Excel文件,大概有百万数据,普通导出需要十几分钟,速度太慢,甲方要求优化。经优化,已达到秒级别。
原因分析:
主要是Excel数据量大,写入太慢。Excel有多个sheet页,一个部门一个sheet,每个sheet页数据条数不统一,采用普通Excel导出,一个sheet页写完再写下一个sheet页,速度太慢。
解决方案:CyclicBarrier+线程池
CyclicBarrier可实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续操作。
CyclicBarrier类的内部有一个计数器count,每个线程在到达屏障点的时候都会调用await方法将自己阻塞,count减1,当count=0的时候所有被阻塞的线程都被唤醒。
主要方法await,此方法有两个重载方法:
await(),是所有线程到达屏障点后进行后续操作;
await(long timeout, TimeUnit unit),让线程等待一段时间,如果还有线程未到屏障点,则到达屏障点的线程进行后续操作。
await方法内部实现代