友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
57. CompletableFuture
Java 中的 Promise。
问题:在一大堆任务中,如何获取第一个完成的返回值?
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
package com.diguage.truman.concurrent;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* @author D瓜哥, https://www.diguage.com/
* @since 2020-03-19 16:04
*/
public class CompletableFutureTest {
@Test
public void test() throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(5);
FutureTask<Integer> futureTask = new FutureTask<>(new Task());
executorService.submit(futureTask);
System.out.println("FutureTask...");
System.out.println(futureTask.get());
System.out.println("FutureTask done.");
List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 20; i++) {
futures.add(executorService.submit(new Task()));
}
executorService.shutdown();
while (!executorService.isTerminated()) {
}
for (Future<Integer> future : futures) {
if (future.isDone()) {
System.out.println(future.get());
}
}
CompletableFuture.runAsync(() -> System.out.println(""));
System.out.println("All tasks were done.");
}
public static class Task implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int second = 0;
try {
ThreadLocalRandom random = ThreadLocalRandom.current();
second = random.nextInt(10000);
Thread.sleep(second);
} catch (InterruptedException e) {
e.printStackTrace();
}
return second;
}
}
}
CompletableFuture
实现了 Future
和 CompletionStage
两个接口。
CompletionStage
接口声明了大量方法, thenApply*
接受 Function
对象,可以实现将任务的结果转化成另外一个对象,类似 Java Stream API 中的 map
操作; thenAccept
接受 Consumer
对象,见文知意,就是“消费”异步任务的结果值,类似 Java Stream API 的“终止操作”。