java请求并行方案_Java并行执行任务的几种方案

最近在排查生产环境问题,发现商品详情接口时不时会报RPC调用超时,检查代码发现接口里面查询活动耗时比较长,都是串行执行的,仔细查看发现完全可以改成并行去执行,缩短接口查询耗时。 比如我们的商品详情接口,需要展示立减、阶梯满减、团购等活动标签。需要查询三次不同的活动信息,再组装活动标签信息。如果每次查询耗时1s,按照串行的方式去调用,整个接口下来至少需要3s,整个耗时,对于我们来讲是无法接受的。其实在jdk中,给我们提供了几种非常便捷的并行执行任务的方法。

CountDownLatch

ExecutorService.invokeAll()

Fork/Join 分而治之 有点类似MapReduce的影子,这个有兴趣的可以自行去了解

改进方案

代码例子:

private void assemblyActivityTag(CartItemDTO itemDTO){

//1.查询立减活动信息,耗时1s

//2.查询阶梯满减活动信息,耗时1s

//3.查询团购活动信息,耗时1s

//4.组装活动标签信息,耗时1s

// 串行执行下来整个耗时4s

}

复制代码

CountDownLatch

private void assemblyActivityTag(CartItemDTO itemDTO){

ExecutorService executorService = Executors.newCachedThreadPool();

CountDownLatch latch = new CountDownLatch(3);

executorService.execute(new Runnable() {

@Override

public void run() {

//1.查询立减活动信息

latch.countDown();

}

});

executorService.execute(new Runnable() {

@Override

public void run() {

//2.查询阶梯满减活动信息

latch.countDown();

}

});

executorService.execute(new Runnable() {

@Override

public void run() {

//3.查询团购活动信息

latch.countDown();

}

});

try {

// 一定记得加上timeout时间,防止阻塞主线程

latch.await(3000,TimeUnit.MILLISECONDS);

} catch (InterruptedException e) {

e.printStackTrace();

}

//4.等待所有子任务完成,组装活动标签信息

//5.关闭线程池

executorService.shutdown();

}

复制代码

ExecutorService.invokeAll()

private void assemblyActivityTag(CartItemDTO itemDTO) {

ExecutorService executorService = Executors.newCachedThreadPool();

List> tasks = Lists.newArrayList();

tasks.add(new Callable() {

@Override

public String call() throws Exception {

//1.查询立减活动信息

return null;

}

});

tasks.add(new Callable() {

@Override

public String call() throws Exception {

//2.查询阶梯满减活动信息

return null;

}

});

tasks.add(new Callable() {

@Override

public String call() throws Exception {

//3.查询团购活动信息

return null;

}

});

try {

List> futureList = executorService.invokeAll(tasks, 3000, TimeUnit.MILLISECONDS);

for (Future future : futureList) {

// 获取线程执行结果

try {

String activityTag = future.get();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

} catch (InterruptedException e) {

e.printStackTrace();

}

//4.组装活动标签信息

//5.关闭线程池

executorService.shutdown();

}

复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值