曹耘豪的博客

Java并发之CompletableFuture

  1. 构造CompletableFuture
  2. 链式调用(异步顺序执行)
  3. 工具方法
  4. 注意事项
    1. 同步操作的线程问题
  5. 参考

Java 8引入了函数式编程,大大提高代码的可读性,写起来也更优雅。异步编程自然也不例外,新增的CompletableFuture就是为了使用函数式编程来更优雅地编写异步代码

构造CompletableFuture

一般直接使用工厂方法创建

链式调用(异步顺序执行)

大多数链式调用都有异步版本(Async结尾),会多一个Executor参数,如果不传会使用ForkJoinPool

工具方法

注意事项

同步操作的线程问题

没有阻塞操作时:

1
2
3
4
5
6
Executor executor = Executors.newCachedThreadPool();
CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName());
return "data";
}, executor)
.thenRun(() -> System.out.println(Thread.currentThread().getName()));

输出:(同步操作在当前线程执行)

1
2
pool-1-thread-1
main

添加阻塞操作:

1
2
3
4
5
6
7
8
9
10
Executor executor = Executors.newCachedThreadPool();
CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName());
try { // 模拟阻塞操作
Thread.sleep(1);
} catch (Exception e) {
}
return "data";
}, executor)
.thenRun(() -> System.out.println(Thread.currentThread().getName()));

输出:(同步操作和异步线程线程一样)

1
2
pool-1-thread-1
pool-1-thread-1

参考

   /