博客
关于我
利用多线程通过对业务优化实现性能优化—— 性能优化利用 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/

你可能感兴趣的文章
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
MFC模态对话框和非模态对话框
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>
Mongodb学习总结(1)——常用NoSql数据库比较
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
mongodb定时备份数据库
查看>>
mppt算法详解-ChatGPT4o作答
查看>>
mpvue的使用(一)必要的开发环境
查看>>
MQ 重复消费如何解决?
查看>>
mqtt broker服务端
查看>>
MQTT 保留消息
查看>>
MQTT 持久会话与 Clean Session 详解
查看>>
MQTT工作笔记0007---剩余长度
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>