业务
场景一:根据商品分类或品牌或商品属性查询出商品信息
场景二:根据商品分类或商品属性查询属性信息
查询分类时,需要查到最末级分类,也就是选择一级类目时,查询出二级类目、三级类目的数据,当选择二级类目时,则查询二级类目、三级类目数据,查询三级类目时,则查询三级数据,三级类目是最后一级类目
由于数据量很大,所以在导出时采用多线程查询db数据,一个线程负责写excel操作。
查询出db数据后,又要对数据进行单个查询处理,补齐数据对象,所以在循环时采用 stream 的 parallelStream
来处理,将结果添加到别一个集合时,注意要使用线程安全的list 例如:Collections.synchronizedList(new ArrayList<>(10));
流程图
通过有界阻塞对队FIFO,实现生产者和消费模式,队列满时,则生产者阻塞,队列为空时,消费者阻塞,查询db数据是多个线程,而写 excel 文件的一个sheet是一个线程(经测试 excel 在创建行时只能从上向下创建,
当用多个线程在一个sheet里创建行并写数据时,会出现打开异常提示或数据出现空白,因为多线程创建行写数据时,可能后面的行已经创建了,但前面的行还没有创建,在excel中是不允许的,所在这里用单线程来创建行和写数据
)