From f1ca917d1f200d6a146f2d8534db83befd27824b Mon Sep 17 00:00:00 2001 From: 8ga Date: Thu, 11 Sep 2025 09:33:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20Java=5F3-5.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java_3-5.md | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/Java_3-5.md b/Java_3-5.md index eb942a7..4ba43e4 100644 --- a/Java_3-5.md +++ b/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 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密集型