栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java并发编程Callable与Future的应用实例代码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java并发编程Callable与Future的应用实例代码

本文主要探究的是java并发编程callable与future的使用,分享了相关实例代码,具体介绍如下。

我们都知道实现多线程有2种方式,一种是继承Thread,一种是实现Runnable,但这2种方式都有一个缺陷,在任务完成后无法获取返回结果。要想获得返回结果,就得使用Callable,Callable任务可以有返回值,但是没法直接从Callable任务里获取返回值;想要获取Callabel任务的返回值,需要用到Future。所以Callable任务和Future模式,通常结合起来使用。

试想一个场景:需要一个帖子列表接口,除了需要返回帖子列表之外,还需要返回每条帖子的点赞列表和评论列表。一页10条帖子来计算,这个接口需要访问21次数据库,访问一次数据库按100ms计算,21次,累计时间为2.1s。这个响应时间,怕是无法令人满意的。怎么办呢?异步化改造接口。

查出帖子列表后,迭代帖子列表,在循环里起10个线程,并发去获取每条帖子的点赞列表,同时另起10个线程,并发去获取每条帖子的评论列表。这样改造之后,接口的响应时间大大缩短,在200ms。这个时候就要用Callabel结合Future来实现。

private List createPostResponseList(Page page,final String userId){ 
    if(page.getCount()==0||page==null||page.getList()==null){ 
      return null; 
    } 
    //获取帖子列表 
    List circleResponseList = page.getList(); 
    int size=circleResponseList.size(); 
    ExecutorService commentPool = Executors.newFixedThreadPool(size); 
    ExecutorService supportPool = Executors.newFixedThreadPool(size); 
    try { 
      List commentFutureList = new ArrayList(size); 
      if (circleResponseList != null && circleResponseList.size() > 0) { 
 for (PostResponse postResponse : circleResponseList) { 
   final String circleId=postResponse.getId(); 
   final String postUserId=postResponse.getUserId(); 
   //查评论列表 
   Callable> callableComment = new Callable>() { 
     @Override 
     public List call() throws Exception { 
return circleReviewsBiz.getPostComments(circleId); 
     } 
   }; 
   Future f = commentPool.submit(callableComment); 
   commentFutureList.add(f); 
   //查点赞列表 
   Callable> callableSupport = new Callable>() { 
     @Override 
     public List call() throws Exception { 
return circleZanBiz.findList(circleId); 
     } 
   }; 
   Future supportFuture = supportPool.submit(callableSupport); 
   commentFutureList.add(supportFuture); 
 } 
 
      } 
      // 获取所有并发任务的执行结果 
      int i = 0; 
      PostResponse temp = null; 
      for (Future f : commentFutureList) { 
 temp = circleResponseList.get(i); 
 temp.setCommentList((List) f.get(); 
 temp.setSupportList((List) f.get(); 
 circleResponseList.set(i, temp); 
 i++; 
      } 
 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } finally { 
      // 关闭线程池 
      commentPool.shutdown(); 
      supportPool.shutdown(); 
    } 
    return circleResponseList; 
} 

总结

以上就是本文关于Java并发编程Callable与Future的应用实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/142150.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号