java8 CompletableFuture

对于多任务耗时的业务场景,一般我们会用到线程异步处理,在以前我们用 Thread 或者 Runnable 来实现异步,这是oracle官方做法,不过缺点很明显

  • 对于复杂业务场景需要配置线程池

  • 代码繁杂,对于新手容易造成不必要的bug

  • 如果涉及到线程锁或线程通讯就棘手了

现在,java8为我们提供了CompletableFuture类,可以完全解决以上问题。

主要方法有:

  • runAsync()异步无参返回

复制代码
@Test
public void asyncThread()throws Exception{
    CompletableFuture async1 = CompletableFuture.runAsync(()->{
        try {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName());
            System.out.println("none return Async");
        }catch (Exception e){
            e.printStackTrace();
        }
    });
    // 调用get()将等待异步逻辑处理完成
    async1.get();
}
复制代码
 
  • supplyAsync()异步有参返回

复制代码
@Test
public void asyncThread2()throws Exception{
    CompletableFuture<String> async2 = CompletableFuture.supplyAsync(()->{
        return "hello";
    });
    String result = async2.get();
    // String result2 = async2.get(5L, TimeUnit.SECONDS);
    System.out.println(result);
}
复制代码
 
  • allOf()多个异步处理(针对有参返回)

复制代码
@Test
public void asyncThread3()throws Exception{
    CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> "hello");
    CompletableFuture<String> b = CompletableFuture.supplyAsync(() -> "youth");
    CompletableFuture<String> c = CompletableFuture.supplyAsync(() -> "!");

    CompletableFuture all = CompletableFuture.allOf(a,b,c);
    all.get();

    String result = Stream.of(a, b,c)
            .map(CompletableFuture::join)
            .collect(Collectors.joining(" "));

    System.out.println(result);
}
复制代码
 
  • anyOf()多个异步随机处理(针对有参返回)

复制代码
@Test
public void asyncThread4()throws Exception{
    CompletableFuture<String> a = CompletableFuture.supplyAsync(() ->{
                try{
                    Thread.sleep(20);
                    return "hello";
                }catch (Exception e){
                    e.printStackTrace();
                    return "none~";
                }
            });
    CompletableFuture<String> b = CompletableFuture.supplyAsync(() -> "youth");
    CompletableFuture<String> c = CompletableFuture.supplyAsync(() -> "!");

    CompletableFuture<Object> any = CompletableFuture.anyOf(a,b,c);
    String result = (String)any.get();

    System.out.println(result);
}
复制代码

 

posted @   草木物语  阅读(152)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2020-05-12 java ThreadLocal
2020-05-12 Java 8中的时间处理
点击右上角即可分享
微信分享提示