CompletableFuture异步编排

CompletableFuture异步编排

  • 一、`CompletableFuture`介绍
  • 创建异步对象

本博客对于了解者友好,用于快速查找方法

先提一下以往创建使用线程的四种方式:

public class ThreadTest {
   @Test
   public void testThread() throws InterruptedException, ExecutionException {
       //MyRunnable
       /*Thread thread = new Thread(new MyRunnable());
       thread.start();*/

       //MyThread
       /*MyThread myThread = new MyThread();
       myThread.start();*/

       //Callable
       /*FutureTask futureTask = new FutureTask(new MyCallable());
       new Thread(futureTask, "aA").start();
       System.out.println(futureTask.get());*/
       
       //线程池
       ThreadPoolExecutor threadPoolExecutor = new
               ThreadPoolExecutor(5, 10, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<>(10));
       threadPoolExecutor.execute(()->{
           System.out.println(Thread.currentThread().getName());
       });
       
       System.out.println(Thread.currentThread().getName());
   }

}

class MyCallable implements Callable {
   @Override
   public Object call() throws Exception {
       System.out.println(Thread.currentThread().getName());
       return "哈哈";
   }
}

class MyThread extends Thread {

   @Override
   public void run() {
       System.out.println(Thread.currentThread().getName());
   }
}

class MyRunnable implements Runnable {

   @Override
   public void run() {
       System.out.println(Thread.currentThread().getName());
   }
}

所打印的结果都是先打印main主程序线程名,然后打印其他线程名,虽然从代码执行顺序来开是相反的,是因为我们新创建的线程不会干预主线程的执行造成的。


一、CompletableFuture介绍


在Java8中,新增加了一个包含50个方法左右的类:CompletableFuture,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果没并且提供了转换和组合CompletableFuture的方法
CompletableFutureFutureTask同属于Future接口的实现类,都可以获取线程的执行结果。
CompletableFuture异步编排_第1张图片

创建异步对象

CompletableFuture主要创建使用方法:
CompletableFuture异步编排_第2张图片

  • runAsync():执行多线程没有返回值
  • supplyAsync():创建多线程的同时执行完任务可以有返回值
  • allof():多任务组合,等待某些线程执行结束
  • anyof():多任务组合,任意一个线程执行完成
  • completedFuture():创建多线程返回传入的值,貌似没什么多大用处。。。。

计算完成后的回调方法
在这里插入图片描述

  • whenComplete():使用上一个任务的线程继续执行该线程
  • whenCompleteAsync():从线程中取出一个新线程使用,①默认线程池,②自定义线程池
  • exceptionally():只能接收异常,同时自己可以返回

线程的的串行和并行 ①使用上一个线程继续执行②③使用新线程执行

  • 接收任务的处理结果,并返回当前任务的返回值
    在这里插入图片描述
  • 接收任务的处理结果,无返回结果
    在这里插入图片描述
  • 只是处理完任务后,执行thenRun的后续操作
    在这里插入图片描述
    待完善··································

你可能感兴趣的:(java,java)