对于多任务耗时的业务场景,一般我们会用到线程异步处理,在以前我们用 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); }