Java实习记录 7 ——使用 Callable 多线程优化接口开发
- 引言
- 正文
- 收获
引言
实习第四周,接触到一个新需求,要求查询用户添的系列课程历史记录,包含分页查询以及按创建时间排序。主要要求查询,课程的名称、课程适合的年龄段、包含单元数量、周计划数量、活动数量以及最后一次更新时间。展开该课程时可以查看该课程下单元的统计信息,包括单元的周计划数量、活动数量。查询使用到了4个表。
正文
该接口的 service 层实现类方法中,首先进行参数校验,获取分页参数以及登录用户信息,校验他们是否为空,不为空进行数据查询。
主要在统计课程单元数量、周数量、活动数量时使用了多线程。
优化前,查询这三个统计数据主要是使用主线程依次调用对应的持久层方法到数据库中进行查询,接口响应时间较长。
优化后:
java"> // 多线程获取统计数据,创建 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();}
使用多线程并发到三个不同数据库中查询,最后同时获取结果,不必再等待上一个执行结束,下一个可并发执行,加快了接口响应速度
收获
在企业中实践了多线程的使用,实现不仅仅把功能完成,同时也进行了对接口的优化,积累了跟多企业开发经验