Java并发编程Callable与Future的应用实例代码
2018-01-10 15:57
537 查看
本文主要探究的是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<PostResponse> createPostResponseList(Page<PostResponse> page,final String userId){ if(page.getCount()==0||page==null||page.getList()==null){ return null; } //获取帖子列表 List<PostResponse> circleResponseList = page.getList(); int size=circleResponseList.size(); ExecutorService commentPool = Executors.newFixedThreadPool(size); ExecutorService supportPool = Executors.newFixedThreadPool(size); try { List<Future> commentFutureList = new ArrayList<Future>(size); if (circleResponseList != null && circleResponseList.size() > 0) { for (PostResponse postResponse : circleResponseList) { final String circleId=postResponse.getId(); final String postUserId=postResponse.getUserId(); //查评论列表 Callable<List<CircleReviews>> callableComment = new Callable<List<CircleReviews>>() { @Override public List<CircleReviews> call() throws Exception { return circleReviewsBiz.getPostComments(circleId); } }; Future f = commentPool.submit(callableComment); commentFutureList.add(f); //查点赞列表 Callable<List<CircleZan>> callableSupport = new Callable<List<CircleZan>>() { @Override public List<CircleZan> 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<CircleReviews>) f.get(); temp.setSupportList((List<CircleZan>) f.get(); circleResponseList.set(i, temp); i++; } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭线程池 commentPool.shutdown(); supportPool.shutdown(); } return circleResponseList; }
总结
以上就是本文关于Java并发编程Callable与Future的应用实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
您可能感兴趣的文章:
相关文章推荐
- Wmic 实例应用代码分享
- python 3.6 正则表达式的应用(附实例代码)
- ucos试验代码实例2:互斥型信号量的应用实例--防止任务优先级反转现象的出现
- [原创]ASP.net 2.0 ObjectDataSource 应用操作代码实例(1)-—访问SQL2005
- Vue.js实现实例搜索应用功能详细代码
- 利用discuz实现PHP大文件上传应用实例代码
- web应用每晚12点定时执行程序代码实例
- Kettle变量和自己定义java代码的实例应用
- 转一个支付宝接口的ASP代码 支付宝接口(应用实例)2008-08-22 16:33支付宝接口的ASP代码
- jquery ajax 应用实例代码
- 数据库sqlite3的使用-代码实例应用
- 为Windows应用创建简单的异步调用模式(附实例代码)
- 以代码实例总结iOS应用开发中数据的存储方式
- JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码
- JS延时器提示框的应用实例代码解析
- 网络编程 CAsyncSocket类的应用实例 聊天程序 客户端代码
- 使用ExecutorService、Callable、Future实现有返回结果的多线程 应用实例
- S3C2416裸机开发系列九_GCC启动代码工程应用实例
- iOS应用开发中监听键盘事件的代码实例小结
- android应用实例代码分享 一站到底站神秘籍 源代码