热门关键字:
jquery > jquery教程 > html5 > java8 异步api、循环、日期

java8 异步api、循环、日期

417
作者:管理员
发布时间:2020/3/27 10:33:30
评论数:0
转载请自觉注明原文:http://www.jq-school.com/Show.aspx?id=1120

  异步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
友荐云推荐