更新 Java_3-5.md
This commit is contained in:
parent
cbd34f2f8c
commit
f1ca917d1f
45
Java_3-5.md
45
Java_3-5.md
@ -1,5 +1,7 @@
|
||||
### 问题1(考察多线程)
|
||||
|
||||
**问题内容**
|
||||
|
||||
假设你现在需要写1个电商APP的用户订单详情接口,这个详情页包含:
|
||||
|
||||
- 关联的商品信息,比如商品名称、尺码、图片、文字介绍等等
|
||||
@ -8,12 +10,47 @@
|
||||
|
||||
这三种数据,彼此之间不耦合,假定每一个查询耗时1秒,单线程的情况下,同步执行三次查询,则需要3秒,如何加速这个查询?
|
||||
|
||||
答案:多线程并行查询,实现方案
|
||||
**问题答案**
|
||||
|
||||
- CompletableFuture,allOf、runAsync、supplyAsync函数
|
||||
- Future或者FutureTask,轮询isDone函数,确保异步任务执行完毕,若有返回值,使用get函数获取结果
|
||||
答案:多线程并行查询
|
||||
|
||||
如果回答的是CompletableFuture,继续延伸以下问题:
|
||||
**实现方案**
|
||||
|
||||
*假定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密集型
|
||||
|
||||
Loading…
Reference in New Issue
Block a user