个人建什么网站比较好,开发软件需要什么软件,企业库,php做的商城网站必备功能通过多线程读取数据#xff0c;使用EasyExcel按顺序导出数据
导出时如果要保证顺序需要使用单线程#xff0c;但是查询时可以用多线程#xff0c;因为多线程查询后返回数据不是按照顺序排列的#xff0c;所以我的思路是再循环时给每个线程打标识#xff0c;通过标识来排序…通过多线程读取数据使用EasyExcel按顺序导出数据
导出时如果要保证顺序需要使用单线程但是查询时可以用多线程因为多线程查询后返回数据不是按照顺序排列的所以我的思路是再循环时给每个线程打标识通过标识来排序多线程返回的结果
创建一个Future对象用于排序多线程查询结果 static class Result {final Integer threadId;final ListUserInfo data;Result(Integer threadId, ListUserInfo data) {this.threadId threadId;this.data data;}}PostMapping(export3)public void export3(HttpServletResponse response) throws IOException, InterruptedException, ExecutionException {// 查询总数Long dataCount userInfoMapper.selectCount();// 每页条数Long searchCount 100000L;// 获取页数并向上取整 5.2 - 6int ceil (int) Math.ceil((double) dataCount / searchCount);// 使用线程池ExecutorService executorService Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());ListFutureResult futures new ArrayList();MapInteger, Result resultsMap new ConcurrentHashMap();// 通过多线程查询并设置线程IDfor (int i 1; i ceil; i) {Integer pageNum Math.toIntExact((i - 1) * searchCount);int finalI i;futures.add(executorService.submit(() - new Result(finalI, userInfoMapper.getList(pageNum, searchCount))));}// 收集所有线程的结果for (FutureResult future : futures) {resultsMap.put(future.get().threadId, future.get());}// 通过线程ID排序ListResult sortedResults resultsMap.values().stream().sorted(Comparator.comparingInt(result - result.threadId)).collect(Collectors.toList());// 构建表头WriteCellStyle headWriteCellStyle new WriteCellStyle();headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);WriteCellStyle contentWriteCellStyle new WriteCellStyle();contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);HorizontalCellStyleStrategy horizontalCellStyleStrategy new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);// 设置返回格式response.setHeader(Content-Disposition, attachment; filenametest DateUtil.format(new Date(), yyyyMMddHHmmss) .xlsx);response.setContentType(application/vnd.ms-excel);response.setCharacterEncoding(UTF-8);ExcelWriter excelWriter EasyExcelFactory.write(response.getOutputStream(), UserInfo.class).registerWriteHandler(horizontalCellStyleStrategy).needHead(true).excelType(ExcelTypeEnum.XLSX).build();// 如果是单sheet则放在循环外面多sheet放在循环里面WriteSheet writeSheet EasyExcelFactory.writerSheet(Sheet1).head(UserInfo.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).registerWriteHandler(horizontalCellStyleStrategy).build();try {// 使用单线程写入ExcelsortedResults.forEach(r - excelWriter.write(r.data, writeSheet));} finally {executorService.shutdown();excelWriter.finish();}}