使用多线程批量导出word
java 多线程
前言,本次业务涉及到导出word的功能,使用的是easyPOI封装的方法,由于导出的word中有大概20M左右的图片,导出的word也有30M左右,由于业务要求,再准备导出的参数是也有一定的耗时,但主要的耗时还是在导出word的方法上,为了提高导出的效率,想到使用多线程去处理导出word的那部分功能逻辑。
代码如下
ExecutorService thradPool = Executors.newFixedThreadPool(2);
for (int i = 1; i < 6; i++) {
Runnable run = new Runnable(){
public void run(){
Thread t = Thread.currentThread();
System.out.println(t+"正在执行任务");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t+"执行任务完毕");
}
};
System.out.println("指派第"+i+"个任务");
thradPool.execute(run);
}
/*
* 停止线程池的方法:
* shutdown()
* 当线程池中的所有任务运行完毕后停止
*
* shutdownNow()
* 立刻停止线程池,线程池中的所有线程会立即被中断。
*/
//thradPool.shutdown();
thradPool.shutdownNow();
System.out.println("停止线程池");
```
用了之后还碰到一个问题,主线程在子线程执行之前就执行完了,不符合我们的业务要求!必须控制子线程全部执行完毕,才去执行主线程,之前只知道用join()方法,昨天还找到一个厉害的
//在循环外指定计数器的长度
CountDownLatch countDownLatch = new CountDownLatch(lmMarkerMobiles.size());
// 在run方法最后,每当一个线成执行完任务后就减一
countDownLatch.countDown();
// 最后在循环外,意思等待全部子线程执行,直到为0
countDownLatch.await();