一、创建线程类MyThread
class MyThread implements Callable<List<String>>{ private String name; private int fromPage; private int endPage; private CountDownLatch latch; MyThread(CountDownLatch latch,String name,int fromPage,int endPage){ this.latch = latch; this.fromPage = fromPage; this.endPage = endPage; this.name = name; } //这里放分段查询业务逻辑,可将生成的文件保存为分包压缩文件 @Override public List<String> call() throws Exception { List<String> list = new ArrayList<String>(); for (int i = fromPage; i <endPage ; i++) { Thread.sleep(100); list.add(name+"--"+i); System.out.println(name+"---"+i); } //每个独立子线程执行完后,countDownLatch值减1 latch.countDown(); return list; } }
二、创建线程池,数量可以根据分页数量进行设置 public static void main(String[] args) throws InterruptedException, ExecutionException { int num = 10; CountDownLatch latch = new CountDownLatch(4); ExecutorService service = Executors.newFixedThreadPool(4); Future<List<String>> list1 = service.submit(new MyThread(latch,"A",0,10)); Future<List<String>> list2 = service.submit(new MyThread(latch,"B",0,10)); Future<List<String>> list3 = service.submit(new MyThread(latch,"C",0,10)); Future<List<String>> list4 = service.submit(new MyThread(latch,"D",0,10)); //主线程阻塞,等待所有子线程执行完成 latch.await(); //将分包压缩文件合并并生成最终文件,同时将分包文件删除 for (int i = 0; i < num; i++) { System.out.println(list1.get().get(i)+";"+list2.get().get(i)+";"+list3.get().get(i)+";"+list4.get().get(i)); } service.shutdown(); }