Java - CompletableFuture

CompletableFuture是Java8中对Future的增强。实现CompletionStage接口(40余个方法),大多数方法多数应用在函数式编程中,并且支持流式调用。

简单实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class CompletableFutureTest implements Runnable {

CompletableFuture<Integer> completableFuture = null;

public CompletableFutureTest(CompletableFuture<Integer> completableFuture) {
this.completableFuture = completableFuture;
}

@Override
public void run() {
int result = 0;
try {
result = completableFuture.get() * completableFuture.get();
} catch (Exception e) {

}
System.out.println(result);
}


public static void main(String[] args) throws InterruptedException, ExecutionException {
final CompletableFuture<Integer> future = new CompletableFuture<>();
new Thread(new CompletableFutureTest(future)).start();
//模拟长时间的计算过程
Thread.sleep(1000);
//告知完成结果
future.complete(60);

}
}

Future最令人诟病的就是要等待,要自己去检查任务是否完成了,在Future中,任务完成的时间是不可控的。而CompletableFuture的最大改进在于,任务完成的时间也开放了出来。

CompletableFuture的异步执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static Integer calc(Integer param) {
try {
//模拟长时间的执行
Thread.sleep(1000);
} catch (InterruptedException e) {

}
return param * param;
}

public static void main(String[] args) throws InterruptedException, ExecutionException {

//异步调用
final CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> calc(50));
System.out.println(future2.get());
}

CompletableFuture的流式调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static Integer calc(Integer param) {
try {
//模拟长时间的执行
Thread.sleep(1000);
} catch (InterruptedException e) {

}
return param * param;
}


public static void main(String[] args) throws InterruptedException, ExecutionException {

//流式调用
CompletableFuture<Void> future3 = CompletableFuture.supplyAsync(() -> calc(40))
.thenApply((i) -> Integer.toString(i))
.thenApply((str) -> "\"" + str + "\"")
.thenAccept(System.out::println);
future3.get();
}

组合多个CompletableFuture:

1
2
3
4
5
6
7
8
9
10
11
12
public static Integer calc2(Integer param) {
return param / 2;
}

public static void main(String[] args) throws InterruptedException, ExecutionException {
//组合多个CompletableFuture
CompletableFuture<Void> future4 = CompletableFuture.supplyAsync(() -> calc2(100))
.thenCompose((i) -> CompletableFuture.supplyAsync(() -> calc2(i)))
.thenApply((str) -> "\"" + str + "\"")
.thenAccept(System.out::println);
future4.get();
}

CompletableFuture跟性能上关系不大,更多的是为了支持函数式编程,在功能上的增强。当然开放了完成时间的设置是一大亮点。

演示的完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package main.java.com.study.completableFuture;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
* @author: whb
* @description: 增强版Future测试类
*/
public class CompletableFutureTest implements Runnable {

CompletableFuture<Integer> completableFuture = null;

public CompletableFutureTest(CompletableFuture<Integer> completableFuture) {
this.completableFuture = completableFuture;
}

@Override
public void run() {
int result = 0;
try {
result = completableFuture.get() * completableFuture.get();
} catch (Exception e) {

}
System.out.println(result);
}

public static Integer calc(Integer param) {
try {
//模拟长时间的执行
Thread.sleep(1000);
} catch (InterruptedException e) {

}
return param * param;
}

public static Integer calc2(Integer param) {
return param / 2;
}

public static void main(String[] args) throws InterruptedException, ExecutionException {
final CompletableFuture<Integer> future = new CompletableFuture<>();
new Thread(new CompletableFutureTest(future)).start();
//模拟长时间的计算过程
Thread.sleep(1000);
//告知完成结果
future.complete(60);

//异步调用
final CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> calc(50));
System.out.println(future2.get());

//流式调用
CompletableFuture<Void> future3 = CompletableFuture.supplyAsync(() -> calc(40))
.thenApply((i) -> Integer.toString(i))
.thenApply((str) -> "\"" + str + "\"")
.thenAccept(System.out::println);
future3.get();

//组合多个CompletableFuture
CompletableFuture<Void> future4 = CompletableFuture.supplyAsync(() -> calc2(100))
.thenCompose((i) -> CompletableFuture.supplyAsync(() -> calc2(i)))
.thenApply((str) -> "\"" + str + "\"")
.thenAccept(System.out::println);
future4.get();
}
}

本文标题:Java - CompletableFuture

文章作者:王洪博

发布时间:2018年08月20日 - 14:08

最后更新:2019年09月12日 - 02:09

原始链接:http://whb1990.github.io/posts/cad2f756.html

▄︻┻═┳一如果你喜欢这篇文章,请点击下方"打赏"按钮请我喝杯 ☕
0%