在过去的一段时间里,博主一直在给大家分享多线程并发编程里面的关键CompletableFfuture类的各种技术点,并发编程作为java开发里面关键点之一,也是大家向上提升重要的一点;对于CompletableFuture的学习一定要学到位,前面给大家分享了很多的知识点,这里分享一下CompletableFuture里面的关键方法的用法,码文不易,希望大家多多支持!
/*1、get()方法的使用*/System.out.println(CompletableFuture.supplyAsync(() -> {return 1;}).get());
/*2、get(long timeout, TimeUnit unit)方法的使用*/System.out.println(CompletableFuture.supplyAsync(() -> {return 2;}).get(2, TimeUnit.SECONDS));
/*3、public T join()方法的使用*/System.out.println(CompletableFuture.supplyAsync(() -> {return 3;}).join());
/*4、public T getNow(T valueIfAbsent)方法的使用*/CompletableFuture async = CompletableFuture.supplyAsync(() -> {return 4;});TimeUnit.SECONDS.sleep(2);/*也是获取结果的方法,在主程序走到这一行的时候,异步程序如果运行完了就返回4,如果没运行完,不会报错,会返回一个托底数据2*/System.out.println(async.getNow(2));
/*5、public boolean complete(T value)方法的使用*/CompletableFuture async = CompletableFuture.supplyAsync(() -> {return 5;});TimeUnit.SECONDS.sleep(2);/*先判断get()是否是能获取到异步线程里面返回的值,如果有就返回true,如果没有就返回false并且将这个值设置为complete(2)里面设置的值*/System.out.println(async.complete(2)+" 结果是:"+async.get());
System.out.println(CompletableFuture.supplyAsync(() -> {System.out.println("创建有返回值的线程");return 1;}).thenApply(a -> {return a + 2;}).thenApply(a -> {return a + 3;}).join());
CompletableFuture.supplyAsync(()->{System.out.println("执行第一步");Integer i=1/0;return 1;}).handle((a,e)->{System.out.println("执行第二步");return a+2;}).handle((a,e)->{System.out.println("执行第三步");return a+3;}).whenComplete((c,e)->{if (e == null) {System.out.println("最后结果:"+c);}}).exceptionally(e->{e.printStackTrace();return null;});
CompletableFuture.supplyAsync(()->{System.out.println("创建有返回值的线程");return 1;}).thenAccept(a->{System.out.println("最终结果:"+a);});
public class ThenApplyDemo {private static int i=0;public static void main(String[] args) throws InterruptedException {/*测试 applyToEither*/System.out.println(CompletableFuture.supplyAsync(() -> {System.out.println("1号进来了");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("1号结束");return 1;}).applyToEither(CompletableFuture.supplyAsync(() -> {System.out.println("2号进来了");try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("2号结束");i=5;return 2;}).applyToEither(CompletableFuture.supplyAsync(() -> {System.out.println("线程3进来了");try {TimeUnit.SECONDS.sleep(4);} catch (InterruptedException e) {e.printStackTrace();}return 3;}), a -> {return a;}), r -> {return r;}).join());TimeUnit.SECONDS.sleep(5);System.out.println(i);}}
/*测试thenCombine*/CompletableFuture.supplyAsync(() -> {System.out.println("步骤一执行");return 1;}).thenCombine(CompletableFuture.supplyAsync(() -> {System.out.println("步骤二执行");try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("步骤二结束");return 2;}), (r1, r2) -> {System.out.println("执行相加");return r1 + r2;}).join();