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的方法
CompletableFuture和FutureTask同属于Future接口的实现类,都可以获取线程的执行结果。
创建异步对象
CompletableFuture主要创建使用方法:
- runAsync():执行多线程没有返回值
- supplyAsync():创建多线程的同时执行完任务可以有返回值
- allof():多任务组合,等待某些线程执行结束
- anyof():多任务组合,任意一个线程执行完成
- completedFuture():创建多线程返回传入的值,貌似没什么多大用处。。。。
计算完成后的回调方法
- whenComplete():使用上一个任务的线程继续执行该线程
- whenCompleteAsync():从线程中取出一个新线程使用,①默认线程池,②自定义线程池
- exceptionally():只能接收异常,同时自己可以返回
线程的的串行和并行 ①使用上一个线程继续执行②③使用新线程执行
- 接收任务的处理结果,并返回当前任务的返回值

- 接收任务的处理结果,无返回结果

- 只是处理完任务后,执行
thenRun的后续操作
待完善··································
版权声明:本文为h15835161250原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
