Java实习记录 7 ——使用 Callable 多线程优化接口开发

Java实习记录 7 ——使用 Callable 多线程优化接口开发

引言

实习第四周,接触到一个新需求,要求查询用户添的系列课程历史记录,包含分页查询以及按创建时间排序。主要要求查询,课程的名称、课程适合的年龄段、包含单元数量、周计划数量、活动数量以及最后一次更新时间。展开该课程时可以查看该课程下单元的统计信息,包括单元的周计划数量、活动数量。查询使用到了4个表。

正文

该接口的 service 层实现类方法中,首先进行参数校验,获取分页参数以及登录用户信息,校验他们是否为空,不为空进行数据查询。
主要在统计课程单元数量、周数量、活动数量时使用了多线程。
优化前,查询这三个统计数据主要是使用主线程依次调用对应的持久层方法到数据库中进行查询,接口响应时间较长。
优化后:

  					// 多线程获取统计数据,创建 Callable 类,定义 call 方法
                    Callable<Integer> getUnitCountCall = () -> curriculumUnitDao.getUnitCountByCurriculumId(i.getId());
                    Callable<Integer> getWeekCountCall = () -> curriculumUnitPlanDao.getPlanCountByCurriculumId(i.getId());
                    Callable<Integer> getActivityCountCall = () -> curriculumDao.getActivitiesCountById(i.getId());
                    // 创建 Future 类,获取线程执行结果
                    FutureTask<Integer> getUnitCountTask = new FutureTask<>(getUnitCountCall);
                    FutureTask<Integer> getWeekCountTask = new FutureTask<>(getWeekCountCall);
                    FutureTask<Integer> getActivityCountTask = new FutureTask<>(getActivityCountCall);
                    // 封装到 Tread 类,开启线程
                    Thread getUnitCountThread = new Thread(getUnitCountTask);
                    Thread getWeekCountThread = new Thread(getWeekCountTask);
                    Thread getActivityCountThread = new Thread(getActivityCountTask);
                    getUnitCountThread.start();
                    getWeekCountThread.start();
                    getActivityCountThread.start();
                    try{
                        // 获取课程单元数量
                        curriculumsResponse.setUnitCount(getUnitCountTask.get());
                        // 获取课程周数量
                        curriculumsResponse.setWeekCount(getWeekCountTask.get());
                        // 获取系列课程活动个数
                        curriculumsResponse.setActivitiesCount(getActivityCountTask.get());
                    }catch (Exception e){
                        e.printStackTrace();
                    }finally {
                        // 关闭线程
                        getUnitCountThread.interrupt();
                        getWeekCountThread.interrupt();
                        getActivityCountThread.interrupt();
                    }

使用多线程并发到三个不同数据库中查询,最后同时获取结果,不必再等待上一个执行结束,下一个可并发执行,加快了接口响应速度

收获

在企业中实践了多线程的使用,实现不仅仅把功能完成,同时也进行了对接口的优化,积累了跟多企业开发经验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值