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

你可能感兴趣的文章
oracle 使用leading, use_nl, rownum调优
查看>>
oracle 修改字段类型方法
查看>>
Oracle 修改数据库表数据提交之后进行回滚
查看>>
UML-总结
查看>>
oracle 内存参数示意图
查看>>
Oracle 写存储过程的一个模板还有一些基本的知识点
查看>>
UML- 配置图(部署图)
查看>>
oracle 切割字符串加引号_使用Clean() 去掉由函数自动生成的字符串中的双引号...
查看>>
Oracle 创建 DBLink 的方法
查看>>
oracle 创建job
查看>>
oracle 创建一个用户,只能访问指定的对象
查看>>
oracle 创建双向备份,Materialized View 物化视图实现 Oracle 表双向同步
查看>>
oracle 创建字段自增长——两种实现方式汇总
查看>>
Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
查看>>
oracle 去重
查看>>
oracle 可传输的表空间:rman
查看>>
Oracle 启动监听命令
查看>>
Oracle 启动阶段 OPEN
查看>>
Oracle 在Drop表时的Cascade Constraints
查看>>
Oracle 在Sqlplus 执行sql脚本文件。
查看>>