Java中的CompletableFuture详解
大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!
在现代Java编程中,异步编程变得越来越重要。Java 8引入了CompletableFuture
,它极大地简化了异步编程的复杂性。CompletableFuture
不仅支持异步操作,还提供了丰富的API来处理异步任务的结果、组合多个异步任务以及处理异常等。本文将详细介绍CompletableFuture
的使用,通过示例代码来展示其强大功能。
1. CompletableFuture的基础使用
首先,我们来看一个基本的CompletableFuture
示例。
package cn.juwatech.future;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class BasicUsage {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 模拟耗时操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, CompletableFuture!";
});
try {
String result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在这个示例中,我们使用CompletableFuture.supplyAsync
方法来异步执行一个耗时操作,并在操作完成后返回结果。future.get()
方法会阻塞当前线程,直到异步操作完成并返回结果。
2. 链式调用和回调
CompletableFuture
支持链式调用和回调,这使得代码更简洁、更易读。以下是一个链式调用的示例:
package cn.juwatech.future;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class ChainUsage {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 模拟耗时操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello";
}).thenApply(result -> result + ", CompletableFuture!")
.thenApply(result -> result + " Chain");
try {
String finalResult = future.get();
System.out.println(finalResult);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在这个示例中,thenApply
方法用于在前一个任务完成后执行一个回调,并将结果传递给下一个任务。
3. 组合多个CompletableFuture
有时,我们需要组合多个异步任务。CompletableFuture
提供了多种方法来实现这一点,例如thenCombine
和allOf
。
package cn.juwatech.future;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CombineUsage {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Future1";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Future2";
});
CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + " & " + result2);
try {
String result = combinedFuture.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在这个示例中,thenCombine
方法将两个CompletableFuture
的结果组合在一起,并返回一个新的CompletableFuture
。
4. 异常处理
异步操作中可能会发生异常,CompletableFuture
提供了多种方法来处理异常,例如exceptionally
和handle
。
package cn.juwatech.future;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class ExceptionHandling {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
if (true) {
throw new RuntimeException("Something went wrong!");
}
return "Hello";
}).exceptionally(ex -> {
System.out.println("Exception: " + ex.getMessage());
return "Recovered from error";
});
try {
String result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在这个示例中,exceptionally
方法用于处理异常,并返回一个默认值。
5. 运行多个异步任务
CompletableFuture.allOf
方法可以用于等待多个异步任务全部完成。
package cn.juwatech.future;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class AllOfUsage {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Future1";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Future2";
});
CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2);
try {
allOf.get(); // 阻塞直到所有任务完成
System.out.println("All tasks completed");
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在这个示例中,CompletableFuture.allOf
方法返回一个新的CompletableFuture
,该任务在所有给定的CompletableFuture
完成后完成。
6. 结合异步和同步任务
CompletableFuture
不仅可以处理异步任务,还可以将异步任务和同步任务结合起来。
package cn.juwatech.future;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class AsyncAndSync {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello";
});
future.thenRun(() -> System.out.println("Async task completed"));
try {
String result = future.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在这个示例中,thenRun
方法在异步任务完成后执行一个同步任务。
总结
通过上述示例,我们详细介绍了CompletableFuture
的各种功能,包括基础使用、链式调用、组合任务、异常处理以及结合同步任务。CompletableFuture
提供了一种简洁且强大的方式来处理异步编程,使得编写复杂的异步代码变得更加容易。
著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!
标签:异步,Java,try,printStackTrace,future,CompletableFuture,catch,详解 From: https://www.cnblogs.com/szk123456/p/18301626