异步编程二:CompletableFuture 优势

55 阅读1分钟

CompletableFuture 实现CompletionStageFuture 两个接口 image.png CompletableFuture的使用具有以下优势和特点:

  • 异步执行:CompletableFuture允许任务在后台线程中异步执行,不会阻塞主线程,提高了应用程序的响应性和性能。
  • 链式操作:通过CompletableFuture提供的方法,可以方便地对任务进行链式操作,构建复杂的任务依赖关系,实现高效的任务调度和执行。
  • 异常处理:CompletableFuture提供了丰富的异常处理方法,可以处理任务执行过程中可能发生的异常,并实现灵活的错误处理和回退机制。
  • 多任务组合:CompletableFuture支持多个任务的并发执行和结果组合。可以轻松地实现多任务并发处理的场景,提高应用程序的效率和并发性。

写一个CompletableFuture demo, 这个demo 需要做四件事:

  • step1: 读取敏感词汇 => thread1
  • step2: 读取文本 => thread2
  • step3: 替换操作 => thread3
  • step4: 打印替换后的文本
public class CompletableFutureDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // step1: 读取敏感词汇 => thread1
        CompletableFuture<List<String>> filterWordFuture = CompletableFuture.supplyAsync(() -> {
            return FileUtil.getLines("filter_words.txt");
        }, executor);

        // step2: 读取文本 => thread2
        CompletableFuture<String> wordFuture = CompletableFuture.supplyAsync(() -> {
            return FileUtil.getContent("text.txt");
        }, executor);

        // step3: 替换操作 => thread3
        CompletableFuture<String> replaceFuture = filterWordFuture.thenCombine(wordFuture, (filterWords, words) -> {
            for (String filterWord : filterWords) {
                words = words.replace(filterWord, "**");
            }
            return words;
        });

        // step4: 打印替换后的文本
        String replace = replaceFuture.get();
        System.out.println(replace);

        executor.shutdown();
    }
}