• 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);
    }
  • 相关阅读:
    api示例
    Windows+Ubuntu文件互传
    UI
    事件
    插件开发入门
    文摘
    刘海屏适配
    APT
    热修复
    进程保活
  • 原文地址:https://www.cnblogs.com/ooo0/p/14759364.html
Copyright © 2020-2023  润新知