博客
关于我
利用多线程通过对业务优化实现性能优化—— 性能优化利用 Thread 的 join
阅读量:778 次
发布时间:2019-03-21

本文共 1749 字,大约阅读时间需要 5 分钟。

我们在开发过程中往往会遇到这样的场景,比如订票时需要组装多种交通方式。假设需求是从A地出发,可以选择先坐高铁去B地,然后转机去莫斯科。在实际操作中,这意味着要同时处理两个独立业务流程:一个是高铁票的扣除,另一个是机票的预订。

如果使用串行处理,逻辑虽简单但效率极低。比如,先调用12306扣高铁票,随后再调用航空公司系统扣机票,这样的流程往往涉及大量业务验证和数据处理。整个过程会显得非常缓慢,特别是在高并发情况下,系统性能会臃肿严重。

这时,多线程就显得尤为重要。我们可以创建两个独立的线程,分别负责处理高铁和机票业务。具体来说,可以让线程A负责与12306进行交互购买高铁票,线程B负责与航空公司系统预订机票。这两条业务线虽然各自独立,但最终结果却是整体的订票成功与否。这里需要注意,若有任一过程失败,整个订票流程都要报 错,并处理相应的退款和手续费。

那么问题来了:主线程如何确保所有子线程都完成任务后,才能继续执行后续逻辑?这就是join方法的用武之地。通过调用Thread.join()方法,主线程可以等待所有子线程执行完毕。具体实现方式是,主线程先启动所有子线程,然后对每个子线程调用join()。在并发环境下,这样的设计可有效提升系统性能,但需要特别注意异常处理和线程同步问题。

以下是一个实际的示例:

public class ThreadJoin {    public static void main(String[] args) {        List
threads = IntStream.range(1, 3) .mapToObj(i -> creatThread(i)) .collect(Collectors.toList()); for (Thread thread : threads) { thread.start(); } for (Thread thread : threads) { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("主线程执行逻辑..."); } private static Thread creatThread(int seq) { return new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "#" + i); shortSleep(); } }); } private static void shortSleep() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } }}

需要注意的是,这样的设计在实际业务场景中需要谨慎评估。例如,高铁票和机票的扣除是否真的可以完全分解为独立操作?是否会存在因果关系,导致某一任务完成后另一任务无法继续执行?这是需要根据具体业务逻辑来判断的。

此外,多线程虽然提升了效率,但也带来了额外的开发复杂度和维护成本。特别是在涉及事务处理、恢复机制和异步通信时,要考虑更多的边界条件和错误处理问题。这也是行业内开发者在实际项目中必须要面对的课题。

转载地址:http://exygz.baihongyu.com/

你可能感兴趣的文章
Openlayers实战:绘制多边形,导出CSV文件
查看>>
Openlayers实战:绘制带箭头的线
查看>>
Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
查看>>
Openlayers实战:非4326,3857的投影
查看>>
Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
查看>>
Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
查看>>
Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
查看>>
Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
查看>>
Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
查看>>
Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
查看>>
Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
查看>>
Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
查看>>
Openlayers高级交互(2/20):清除所有图层的有效方法
查看>>
Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
查看>>
Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
查看>>
Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
查看>>
Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
查看>>
Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
查看>>
Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
查看>>
Openlayers高级交互(8/20):选取feature,平移feature
查看>>