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

你可能感兴趣的文章
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>
MYSQL:基础——触发器
查看>>
Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
查看>>
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump 导出数据库中每张表的前n条
查看>>
mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
查看>>