异步api
对于多任务耗时的业务场景,一般我们会用到线程异步处理,在以前我们用Thread或者Runnable来实现异步,这是oracle官方做法,不过缺点很明显
对于复杂业务场景需要配置线程池
代码繁杂,对于新手容易造成不必要的bug
如果涉及到线程锁或线程通讯就棘手了
现在,java8为我们提供了CompletableFuture类,可以完全解决以上问题。
主要方法有:
runAsync()异步无参返回
样例:
@Test
publicvoidasyncThread()throwsException{
CompletableFutureasync1=CompletableFuture.runAsync(()->{
try{
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName());
System.out.println("nonereturnAsync");
}catch(Exceptione){
e.printStackTrace();
}
});
//调用get()将等待异步逻辑处理完成
async1.get();
}
supplyAsync()异步有参返回
样例:
@Test
publicvoidasyncThread2()throwsException{
CompletableFuture<String>async2=CompletableFuture.supplyAsync(()->{
return"hello";
});
Stringresult=async2.get();
//Stringresult2=async2.get(5L,TimeUnit.SECONDS);
System.out.println(result);
}
allOf()多个异步处理(针对有参返回)
样例:
@Test
publicvoidasyncThread3()throwsException{
CompletableFuture<String>a=CompletableFuture.supplyAsync(()->"hello");
CompletableFuture<String>b=CompletableFuture.supplyAsync(()->"youth");
CompletableFuture<String>c=CompletableFuture.supplyAsync(()->"!");
CompletableFutureall=CompletableFuture.allOf(a,b,c);
all.get();
Stringresult=Stream.of(a,b,c)
.map(CompletableFuture::join)
.collect(Collectors.joining(""));
System.out.println(result);
}
anyOf()多个异步随机处理(针对有参返回)
样例
@Test
publicvoidasyncThread4()throwsException{
CompletableFuture<String>a=CompletableFuture.supplyAsync(()->{
try{
Thread.sleep(20);
return"hello";
}catch(Exceptione){
e.printStackTrace();
return"none~";
}
});
CompletableFuture<String>b=CompletableFuture.supplyAsync(()->"youth");
CompletableFuture<String>c=CompletableFuture.supplyAsync(()->"!");
CompletableFuture<Object>any=CompletableFuture.anyOf(a,b,c);
Stringresult=(String)any.get();
System.out.println(result);
}
循环ForEach
java8在原有for或iterator循环下又提供了forEach的方法,不过与for循环不同的是forEach循环是建立在stream之上的,而且比for或iterator方便的是,他可以循环Map对象,
如果您尝试配合filter处理就更赞了~
forEach对List的循环样例
@Test
publicvoidlistForeach(){
List<String>lst=newArrayList<String>(5){{
add("A");
add("B");
add("H");
add("O");
add("M");
}};
lst.forEach(System.out::println);
lst.forEach((item)->System.out.println(item.concat("_")));
}
forEach对数组的循环样例
@Test
publicvoidarrForeach(){
String[]strArr=newString[]{"A","B","C","D"};
Arrays.stream(strArr).forEach(System.out::println);
}
forEach对int范围的循环样例
@Test
publicvoidnumericForeach(){
IntStream.range(0,10).forEach(System.out::println);
}
如果您觉得本文的内容对您的学习有所帮助:
关键字:
java