### 问题1(考察多线程) **问题内容** 假设你现在需要写1个电商APP的用户订单详情接口,这个详情页包含: - 关联的商品信息,比如商品名称、尺码、图片、文字介绍等等 - 订单的基础信息,比如创建时间、支付金额 - 订单的快递信息,比如从上海运往杭州,目前运输车辆的位置 这三种数据,彼此之间不耦合,假定每一个查询耗时1秒,单线程的情况下,同步执行三次查询,则需要3秒,如何加速这个查询? **问题答案** 答案:多线程并行查询 **实现方案** *假定3个Runnable对象task1、task2、task3作为查询函数体** ```java Runnable task1 = () -> System.out.println("Task 1"); Runnable task2 = () -> System.out.println("Task 2"); Runnable task3 = () -> System.out.println("Task 3"); ``` **方案一、CompletableFuture** ```java // 使用 CompletableFuture 的 runAsync 函数,声明3个异步任务 CompletableFuture cf1 = CompletableFuture.runAsync(task1); CompletableFuture cf2 = CompletableFuture.runAsync(task2); CompletableFuture cf3 = CompletableFuture.runAsync(task3); // 通过 CompletableFuture 的 allOf 函数,添加3个异步任务,调用 get 函数阻塞 CompletableFuture.allOf(cf1, cf2, cf3).get(); ``` **方案二、Future**或者**FutureTask** ```java // 使用自定义线程池 ExecutorService executor = Executors.newFixedThreadPool(3); // 把这3个任务提交给线程池并行执行 Future f1 = executor.submit(task1); Future f2 = executor.submit(task2); Future f3 = executor.submit(task3); // 使用get函数,等待3个任务执行完毕 f1.get(); f2.get(); f3.get(); ``` **如果回答的是CompletableFuture,继续延伸以下问题:** - CompletableFuture的默认线程池是什么?答案:ForkJoinPool - ForkJoinPool适合CPU密集型还是IO密集型任务?答案:CPU密集型 - 用CompletableFuture处理IO密集型的任务,应该怎么做?答案:自定义一个IO密集型的线程池 ### 问题2(考察对Mybatis-Plus或者Mybatis框架的熟练度)