在Java中,异步任务可以通过'Future'和'CompletableFuture'来实现。
1. Future:
- 'Future'是在Java 5中引入的,用于表示异步计算的结果。
- 通过'submit'方法将任务提交给'ExecutorService'后,会返回一个'Future'对象,通过该对象可以获取任务执行的结果或取消任务。
- 'Future'的'get'方法会阻塞当前线程直到任务完成,并返回计算的结果或抛出异常(如果存在)。
- 'Future'在处理多个异步任务时,需要通过`get`方法不断地轮询任务是否完成,因此可能存在一定的阻塞风险。
- 'Future'本身并没有提供太多的方法来处理任务完成后的逻辑,因此在某些场景下需要额外的处理。
示例代码:
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<String> future = executor.submit(() -> {// 执行异步任务return "Result";
});
String result = future.get(); // 阻塞直到任务完成
2. CompletableFuture:
- 'CompletableFuture'是在Java 8中引入的,对'Future'的补充和增强,提供了更加强大和灵活的异步编程机制。
- 与'Future'不同,'CompletableFuture'提供了丰富的方法链式地处理任务完成后的结果,比如'thenApply'、'thenCompose'等方法。
- 'CompletableFuture'支持通过'complete'、'completeExceptionally'手动完成或异常完成一个任务,也支持通过'thenCompose'、'thenCombine'等方法组合多个任务。
- 'CompletableFuture'还支持异常处理、超时等功能,使得异步任务处理更加灵活和便捷。
示例代码:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 执行异步任务return "Result";
});
future.thenAccept(result -> {// 处理任务完成后的结果
});
在实际应用中,'CompletableFuture'相比'Future'具有更强的扩展性和灵活性,可以更加方便地处理异步任务的结果及异常,组合多个异步任务的执行流程。
此外,'CompletableFuture'还可以配合'allOf'、'anyOf'等方法来处理多个异步任务的并行执行,以及配合'thenApply'、'thenCompose'等方法来实现更复杂的异步任务处理逻辑。