异步线程阻塞等待完成
当你遇到一个场景,需要同时启动多个任务,并等待所有任务完成后执行后续操作。这个方法很有用,比如你需要执行三个下载任务,当三个任务都下载完成后你才通知界面说完成,这个时候如果一个个去下载肯定耗时非常高,我们可以同时起三个线程去并行执行任务,减少总的执行时间。
下面是一段例子代码:
// 模拟N个下载任务列表
ArrayList<Object> downloadTaskList = new ArrayList<>();
List<CompletableFuture<Void>> futureList = downloadTaskList.stream().map(downloadParam -> CompletableFuture.runAsync(() -> {// 下载任务downloadTask(downloadParam);})).collect(Collectors.toList());// 等待所有异步任务完成CompletableFuture<Void> allOf = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]));// 阻塞等待所有结果allOf.join();//执行其他操作
2个异步线程执行完后阻塞
// 创建第一个异步任务CompletableFuture<String> future1 = CompletableFuture.runAsync(() -> {try {System.out.println("Task 1 is running");Thread.sleep(2000); // 模拟任务执行return "Task 1 is completed";} catch (InterruptedException e) {e.printStackTrace();}});// 创建第二个异步任务CompletableFuture<String> future2 = CompletableFuture.runAsync(() -> {try {System.out.println("Task 2 is running");Thread.sleep(3000); // 模拟任务执行return "Task 2 is completed";} catch (InterruptedException e) {e.printStackTrace();}});// 创建一个CompletableFuture,等待两个异步任务都完成CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2);allTasks.thenRun(() -> {try {// 获取任务结果String result1 = future1.get();String result2 = future2.get();// 在此进行后续操作} catch (Exception e) {log.error("任务执行异常", e);}}).join();