提交订单性能优化系列之012-引入FutureTask


概括总结

引入FutureTask能提高并发度,相应就可以提升性能,这次测试的结是,提升了38.93%(参考值)。它的缺点也很明显,就是增加了代码的复杂度,不方便阅读了,且对异常也要额外处理,而且大家对FutureTask也不是很熟悉。衡量利弊之后,我觉得是值得引入的。


012版本更新说明

这一版本找到了一个办法来消除测试方法执行的顺序带来的误差,即:使用一个随机数来判断先执行哪个方法。代码见这里

这一版本引入了FutureTask。代码见这里


测试结果

统计10次测试的平均值之后:

Version012FutureTask 提交每个订单平均耗时的纳秒数: 5020455

Version012Normal 提交每个订单平均耗时的纳秒数: 6975366

Version012FutureTask 每秒钟可以提交的订单数: 200

Version012Normal 每秒钟可以提交的订单数: 143

性能差别为:(6975366 - 5020455) / 5020455 * 100% = 38.93%,即:引入FutureTask后,性能提升了38.93%。 这已经是一个不错的成绩了。

【备注】:不同的机器上的测试结果会不一样,以上测试结果仅供参考。


测试结果说明

对数据库的插入和修改操作很费时,比查询操作高出一个数量级。在提交订单的7步操作中,有3步操作是涉及到插入与修改的,分别是:

第5步:保存订单到数据库中,并返回订单ID

第6步:保存订单商品到数据库中

第7步:更新商品的库存与销量

这3步操作是同一个线程中是顺序执行的。引入FutureTask的目的是:让第5步操作与第7步操作并行执行。(注意由于第6步的操作依赖于第5步获取的订单ID,所以它必须在第5步的后面执行)。于是假设原本顺序执行时每个操作需要1秒,共耗时3秒,则引入FutureTask以后,只需要2秒就可以完成。


补充说明

在查询资料的过程中,有文章提到,FutureTask已经不推荐使用了,推荐使用的是CompletableFuture,参考这篇博客:Java8新特性整理之CompletableFuture:组合式、异步编程(七)

我自己测试了下CompletableFuture,发现并没有提升性能,反而下降了50%以上。但是考虑到我对这个类的用法并不熟练,可能是我写的代码有问题,所以就没有把测试代码提交到github上去,后来干脆删掉了。暂时不打算研究了。


源码

012版本的github源码在这里,如果不知道怎样运行项目,请参考这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FutureTask是一个实现了RunnableFuture接口的类,它继承了Runnable和Future接口。因此,FutureTask既可以被当作一个Runnable来使用,也可以被当作一个Future来使用。 FutureTask实现了Future接口,完成了对Future接口的基本实现。除了实现了Future接口以外,FutureTask还实现了Runnable接口,这意味着它可以交由Executor执行,也可以直接用线程调用执行(futureTask.run())。 FutureTask具有三种执行状态:未启动、已启动和已完成。未启动指的是在调用run()方法之前,FutureTask处于未启动状态。已启动指的是FutureTask对象的run方法正在执行过程中,FutureTask处于已启动状态。已完成指的是FutureTask正常执行结束,或者被取消,或者执行过程中抛出异常而导致中断而结束。 在ThreadPoolExecutor的submit方法中,返回的是一个Future的实现,而这个实现就是FutureTask的一个具体实例。FutureTask帮助实现了具体的任务执行,并与Future接口中的get方法关联起来。 总结起来,FutureTask是一个能够同时担任Runnable和Future角色的类,它可以作为一个任务提交给线程池执行,也可以通过get方法来获取任务执行的结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【第十二篇】Java 线程池FutureFutureTask【重点】](https://blog.csdn.net/weixin_42039228/article/details/123198358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [FutureTask简介](https://blog.csdn.net/u014516601/article/details/125123415)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值