多线程 ---- CountDownLatch

mac2026-01-31  2

最近在重构并优化之前的代码,一个简单的接口单线程查了12次数据库相应时间1300ms最左右,这还是数据量在几百条的时候。有代码洁癖的我不能容忍。于是乎,优化他。由于需要等待结果全部返回,所以我选择了CountDownLatch+线程池+CompletableFuture实现。

CountDownLatch是一种java.util.concurrent包下一个同步工具类,它允许一个或多个线程等待直到在其他线程中一组操作执行完成。

直接上实现的伪代码

#由于业务复杂,故采用伪代码展示 //创建线程池 private ScheduledExecutorService testPool = new ScheduledThreadPoolExecutor(10, new BasicThreadFactory.Builder().namingPattern("test-pool-%d").daemon(true).build()); List<Future<CompletableFuture<List<Obj>>>> futureList = new ArrayList<>(); List<String> types = new ArrayList<>(); types.add("a"); types.add("b"); types.add("c"); types.add("d"); types.add("e"); types.add("f"); types.add("g"); CountDownLatch latch = new CountDownLatch(types.size()); for (String type : types) { Future<CompletableFuture<Obj>> future = testPool .submit(() -> getObjByType(latch, type)); futureList.add(future); } try { //等待所有结果返回(等待到latch到0继续往下执行) latch.await(); //遍历结果集 for (Future<CompletableFuture<Obj>> future : futureList) { Obj obj = future.get().get(); .......... } } catch (InterruptedException e) { e.printStackTrace(); } //查询方法 public CompletableFuture<Obj> getObjByType(CountDownLatch latch, String type){ try { //do your query } finally { //latch-1, 一定不能忘记 latch.countDown(); } return CompletableFuture.completedFuture(obj); }

经过实测接口返回时间300-400ms ,提升了3倍。。。  

最新回复(0)