首页 > 编程语言 >Java中的CompletableFuture详解

Java中的CompletableFuture详解

时间:2024-07-14 15:43:19浏览次数:15  
标签:异步 Java try printStackTrace future CompletableFuture catch 详解

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

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

标签:异步,Java,try,printStackTrace,future,CompletableFuture,catch,详解
From: https://www.cnblogs.com/szk123456/p/18301626

相关文章

  • Java中的ReentrantLock详解
    Java中的ReentrantLock详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java编程中,多线程同步是一个常见的需求。为了保证多个线程对共享资源的安全访问,Java提供了多种锁机制,其中ReentrantLock是一个重要的工具。本文将详细介绍ReentrantLock的使用,......
  • 深入理解Java中的反射机制
    深入理解Java中的反射机制大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,反射机制是一种非常强大的工具,它允许程序在运行时检查和操作类、方法、字段等。反射机制不仅在框架开发中有着广泛的应用,而且在某些动态需求场景中也是必不可少的。本......
  • Java中的垃圾回收机制详解
    Java中的垃圾回收机制详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java中,垃圾回收机制(GarbageCollection,GC)是自动管理内存的一项重要特性。它能够自动释放不再使用的对象所占用的内存,减少内存泄漏和程序崩溃的风险。本文将深入探讨Java中的垃......
  • Java并发编程中的锁机制详解
    Java并发编程中的锁机制详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java并发编程中,锁机制是保证线程安全的重要手段。锁的作用是确保同一时刻只有一个线程能够访问被锁保护的资源,从而避免数据不一致和并发冲突。本文将详细介绍Java并发编程中的......
  • 细粒度掌控:精通Gradle中Java插件的配置艺术
    细粒度掌控:精通Gradle中Java插件的配置艺术引言Gradle是一个灵活且功能丰富的构建工具,它通过插件扩展其功能。Java插件是Gradle中最常用的插件之一,为Java项目提供了丰富的构建生命周期任务和约定。合理配置Java插件,可以极大提升Java项目的构建效率和质量。Java插件简介G......
  • JAVA入门到精通:第一课
    一、JDK下载1、访问oracle官网,选择Java建议选择Java17(长期支持版本)2、选择合适的安装包3、安装过程:傻瓜式“下一步”安装安装路径:建议创建一个新的文件夹,在D盘统一管理4、安装完成后,路径中的文件目录如下所示bin:是最重要的文件夹二、HelloWord程序编写1、记事本......
  • Java基础(For循环/While循环/一维数组/二维数组)
    for循环语句for循环语句中两个分号是绝对不能少的,其他不可以没有,此时for循环就成了死循环。publicclassForDemo{ publicstaticvoidmain(String[]args) { //死循环 for(;;) { System.out.println("for---"); } }}while循环语句格式:初始......
  • Java零基础-集合:集合框架中的工具类
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的......
  • 记录些Java题集(1)
    接口防刷机制接口被刷指的是同一接口被频繁调用,可能是由于以下原因导致:恶意攻击:攻击者利用自动化脚本或工具对接口进行大量请求,以消耗系统资源、拖慢系统响应速度或达到其他恶意目的。误操作或程序错误:某些情况下,程序错误或误操作可能导致接口被重复调用,例如循环调用或者定时......
  • 详解tcp四次挥手
    TCP四次挥手详解TCP四次挥手用于关闭客户端和服务器之间的连接。它确保双方能够有序地终止连接,避免数据丢失。四次挥手的过程第一次挥手:客户端发送FIN报文客户端向服务器发送一个FIN(Finish)报文,请求终止连接。报文包含一个序列号,如FIN=1,seq=x。意义:客户端通知服务......