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

2025-05-29 0 69

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

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

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56
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的应用实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/qq_33556185/article/details/77018370

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java并发编程Callable与Future的应用实例代码 https://www.kuaiidc.com/113062.html

相关文章

发表评论
暂无评论