一、CountDownLatch-倒计时工具类
案例:基于CountDownLatch实现多线程Excel导出
package com.henchuan.website.tools;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author 狠穿
* @date 2024/4/23
* @remark 基于CountDownLatch实现多线程场景excel导出
*/
public class CountDownLatchTest {
private final int SHEETS_NUMBER = 4;
private ExecutorService executorService = Executors.newFixedThreadPool(SHEETS_NUMBER);
public void createExcel() throws Exception {
Workbook workbook = new XSSFWorkbook();
CountDownLatch countDownLatch = new CountDownLatch(SHEETS_NUMBER);
for (int sheetIndex = 0; sheetIndex < SHEETS_NUMBER; sheetIndex++) {
int finalSheetIndex = sheetIndex;
//处理具体的sheet
Sheet sheet = workbook.createSheet("sheet"+finalSheetIndex);
//sheet内部处理交给各个线程自行处理
executorService.execute(() -> {
processSheet(sheet);
System.out.println(Thread.currentThread()+" 正在处理sheet "+finalSheetIndex);
countDownLatch.countDown();
});
}
countDownLatch.await();
System.out.println(Thread.currentThread()+" excel处理完毕");
workbook.write(new FileOutputStream("demo.xlsx"));
}
/**
* 处理具体的sheet页
* @param sheet sheet
*/
private void processSheet(Sheet sheet) {
//单元格数据写入
for (int i = 0; i < 10; i++) {
Row row = sheet.createRow(i);
for (int j=0; j< 10;j++){
Cell cell = row.createCell(j);
//这里将sheet的名称作为单元格的值写入,实际情况可能是从数据库中获取数据填入
cell.setCellValue(sheet.getSheetName());
}
}
}
public static void main(String[] args) throws Exception {
CountDownLatchTest test = new CountDownLatchTest();
test.createExcel();
}
}