1
0
md/Java_3-5.md
2025-09-11 09:33:40 +08:00

60 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### 问题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<Void> cf1 = CompletableFuture.runAsync(task1);
CompletableFuture<Void> cf2 = CompletableFuture.runAsync(task2);
CompletableFuture<Void> cf3 = CompletableFuture.runAsync(task3);
// 通过 CompletableFuture 的 allOf 函数添加3个异步任务调用 get 函数阻塞
CompletableFuture.allOf(cf1, cf2, cf3).get();
```
**Future**或者**FutureTask**
```java
// 使用自定义线程池
ExecutorService executor = Executors.newFixedThreadPool(3);
// 把这3个任务提交给线程池并行执行
Future<Void> f1 = executor.submit(task1);
Future<Void> f2 = executor.submit(task2);
Future<Void> 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框架的熟练度