发布时间: 阅读量

使用多线程批量导出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();

参考
qqtu-pian-20191015142015