CompletableFuture<Void> allTask = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])) .whenComplete((t, e) -> { System.out.println("所有任务都完成了, 返回结果集: " + futureList.stream().map(CompletableFuture::join).collect(Collectors.joining(","))); }); // 阻塞主线...
public<U>CompletableFuture<U> thenCompose(Function<?superT, ? extendsCompletionStage<U>> fn);public<U>CompletableFuture<U> thenComposeAsync(Function<?superT, ? extendsCompletionStage<U>> fn) ;public<U>CompletableFuture<U> thenComposeAsync(Function<?superT, ? extendsCompletionStage<U>> fn,Executorex...
*/publicclassCompletableFutureTest{publicstaticvoidmain(String[]args)throws ExecutionException,InterruptedException{Runnable runnable=()->System.out.println("执行无返回结果的异步任务");System.out.println(CompletableFuture.runAsync(runnable).get());CompletableFuture<String>future=CompletableFuture.supplyAsync(()...
CompletableFuture如果不提供线程池的话,默认使用的ForkJoinPool,而ForkJoinPool内部是守护线程,如果main线程结束了,守护线程会跟着一起结束。 publicstaticvoidmain(String[]args){// 生产者,可以指定返回结果CompletableFuture<String>firstTask=CompletableFuture.supplyAsync(()->{System.out.println("异步任务开始执行")...
一、 CompletableFuture介绍 平时多线程开发一般就是使用Runnable,Callable,Thread,FutureTask,ThreadPoolExecutor这些内容和并发编程息息相关。相对来对来说成本都不高,多多使用是可以熟悉这些内容。这些内容组合在一起去解决一些并发编程的问题时,很多时候没有办法很方便的去完成异步编程的操作。
CompletableFuture实现了CompletionStage接口的如下策略: 为了完成当前的CompletableFuture接口或者其他完成方法的回调函数的线程,提供了非异步的完成操作。 没有显式入参Executor的所有async方法都使用ForkJoinPool.commonPool()为了简化监视、调试和跟踪,所有生成的异步任务都是标记接口AsynchronousCompletionTask的实例。
因为CompletableFuture实现了Future接口,我们先来回顾Future吧。 Future是Java5新加的一个接口,它提供了一种异步并行计算的功能。如果主线程需要执行一个很耗时的计算任务,我们就可以通过future把这个任务放到异步线程中执行。主线程继续处理其他任务,处理完成后,再通过Future获取计算结果。
1.2 创建CompletableFuture CompletableFuture在创建时,如果传入线程池,那么会去指定的线程池工作。如果没传入,那么回去默认的ForkJoinPool ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个小任务,把多个小任务放到多个处理器核心上并行执行;当多个小任务执行完成之后,再将这些执行结果合并起...
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");检查任务完成状态: 使用 isDone 方法可以检查任务是否已经完成。boolean isDone = future.isDone();等待任务完成: 通过get方法,阻塞当前线程,直到异步任务完成并获取其结果。System.out.println("main Thread"); //开启异步线程 ...