zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    C# GridView点击某列打开新浏览器窗口
    大白话系列之C#委托与事件讲解(二)
    大白话系列之C#委托与事件讲解(一)
    Razor语法大全
    Expression<Func<T,TResult>>和Func<T,TResult>
    C#委托的介绍(delegate、Action、Func、predicate)
    Android--样式经验
    Android--onSaveInstanceState()保存数据
    Android--ActivityLiving生命周期
    android--快捷键
  • 原文地址:https://www.cnblogs.com/ooo0/p/14759364.html
Copyright © 2011-2022 走看看