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

你可能感兴趣的文章
Mysql order by与limit混用陷阱
查看>>
Mysql order by与limit混用陷阱
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
mysql replace用法
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql server has gone away
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
MYSQL sql语句针对数据记录时间范围查询的效率对比
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>
mysql union orderby 无效
查看>>
mysql v$session_Oracle 进程查看v$session
查看>>