### 问题1(考察多线程) 假设你现在需要写1个电商APP的用户订单详情接口,这个详情页包含: - 关联的商品信息,比如商品名称、尺码、图片、文字介绍等等 - 订单的基础信息,比如创建时间、支付金额 - 订单的快递信息,比如从上海运往杭州,目前运输车辆的位置

提问:这三种数据,彼此之间不耦合,假定每一个查询耗时1秒,单线程的情况下,同步执行三次查询,则需要3秒,如何加速这个查询?

答案:多线程并行查询

追问:假定有3个Runnable对象,分别是task1、task2、task3作为查询函数对象,如何调度或者编排这3个task?

> 如果没反应过来,引导一下:比如说用 CompletableFuture、Future 或者 FutureTask 说一下关键,要调用哪几个函数。

方案一、使用 CompletableFuture 的 runAsync 函数包装3个task。再通过 allOf 函数添加3个task,调用 get 函数阻塞等待3个任务执行完毕。

方案二、使用Future,把3个task提交给1个自定义线程池并接收Future对象,再使用get函数等待3个任务执行完毕

**如果回答的是CompletableFuture,继续延伸以下问题:**

CompletableFuture的默认线程池是什么?

答案:ForkJoinPool

ForkJoinPool适合CPU密集型还是IO密集型任务?

答案:CPU密集型

用CompletableFuture处理IO密集型的任务,应该怎么做?

答案:自定义一个IO密集型的线程池

### 问题2(考察对Mybatis-Plus或者Mybatis框架的熟练度) 假设现在需要针对用户表里的**手机号、身份证号码**加密存储,业务上还需要根据*手机号后4位*和*身份证号后6位*的筛选。

提问:请基于 Spring Boot 和 Mybatis 或 Mybatis Plus,说一下*手机号*和*身份证号*写入时加密,查询时解密,并且支持*手机号后4位*和*身份证号后6位*的筛选的实现思路。

答案:声明一个自定义注解,修饰实体类里的*手机号和身份证号码*。 创建一个类,实现 Mybatis Plus 的 MetaObjectHandler 接口,覆写 **insertFill** 和 **updateFill** 处理数据的加密。 再创建一个类,实现 Mybatis 的 Interceptor 接口,拦截 ResultSetHandler 的 handleResultSets 函数,处理数据的解密。