Java中的CompletableFuture详解

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提供了多种方法来实现这一点,例如thenCombineallOf

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提供了多种方法来处理异常,例如exceptionallyhandle

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提供了一种简洁且强大的方式来处理异步编程,使得编写复杂的异步代码变得更加容易。

著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

posted @ 2024-07-14 15:32  省赚客开发者团队  阅读(20)  评论(0编辑  收藏  举报