1 1 package com.gupaoedu.completablefuture;
2 2
3 3 import org.junit.Test;
4 4 import java.util.Arrays;
5 5 import java.util.List;
6 6 import java.util.concurrent.*;
7 7 import static java.util.stream.Collectors.toList;
8 8
9 9 public class Client {
10 10
11 11 @Test
12 12 public void test0() throws Exception {
13 13 long start = System.currentTimeMillis();
14 14 ExecutorService executorService = Executors.newCachedThreadPool();
15 15 Future<Double> future = executorService.submit(() -> {
16 16 Thread.sleep(1000L);
17 17 return Math.random();
18 18 });
19 19 Thread.sleep(1000L);
20 20 try {
21 21 /** 获取线程执行的结果,传递的是等待线程的时间,单位是1秒 */
22 22 future.get(1, TimeUnit.SECONDS);
23 23 } catch (ExecutionException e) {
24 24 e.printStackTrace();
25 25 } catch (TimeoutException e) {
26 26 e.printStackTrace();
27 27 }
28 28 System.out.println("共耗时" + (System.currentTimeMillis() - start) + "ms");// 1014ms
29 29 }
30 30
31 31 @Test
32 32 public void main() {
33 33 Shop shop = new Shop("BestShop");
34 34 long start = System.currentTimeMillis();
35 35 Future<Double> future = shop.getPriceAsync("My Favorite");
36 36 long invocationTime = System.currentTimeMillis() - start;
37 37 System.out.println("调用接口时间:" + invocationTime + "毫秒");
38 38
39 39 doSomethingElse();
40 40
41 41 try {
42 42 double price = future.get();
43 43 } catch (InterruptedException e) {
44 44 e.printStackTrace();
45 45 } catch (ExecutionException e) {
46 46 e.printStackTrace();
47 47 }
48 48
49 49 long retrievalTime = System.currentTimeMillis() - start;
50 50 System.out.println("返回价格消耗时间:" + retrievalTime + "毫秒");
51 51
52 52 }
53 53
54 54 public static void doSomethingElse() {
55 55 System.out.println("做其他的事情。。。");
56 56 }
57 57
58 58 @Test
59 59 public void test1() {
60 60 long start = System.currentTimeMillis();
61 61 System.out.println(findPrice("java8实战"));
62 62 long duration = System.currentTimeMillis() - start;
63 63 System.out.println("总消耗时间:" + duration + "毫秒");
64 64 }
65 65
66 66
67 67 public static List<String> findPrice(String product) {
68 68 List<Shop> shops = Arrays.asList(new Shop("sunjin.org"),
69 69 new Shop("加瓦匠"),
70 70 new Shop("京东商城"),
71 71 new Shop("天猫商城"));
72 72 return shops.parallelStream()
73 73 .map(shop -> String.format("%s 的价格是 %.2f", shop.getName(), shop.getPrice(product)))
74 74 .collect(toList());
75 75 }
76 76
77 77 @Test
78 78 public void test2() {
79 79 long start = System.currentTimeMillis();
80 80 System.out.println(findPrice2("java8实战"));
81 81 long duration = System.currentTimeMillis() - start;
82 82 System.out.println("总消耗时间:" + duration + "毫秒");
83 83 }
84 84 public static List<String> findPrice2(String product){
85 85 List<Shop> shops = Arrays.asList(new Shop("sunjin.org"),
86 86 new Shop("加瓦匠"),
87 87 new Shop("京东商城"),
88 88 new Shop("天猫商城"));
89 89 List<CompletableFuture<String>> priceFuture = shops.stream()
90 90 .map(shop -> CompletableFuture.supplyAsync( // 使用异步的方式计算每种商品的价格
91 91 () -> shop.getName() + " 的价格是 " + shop.getPrice(product)))
92 92 .collect(toList());
93 93 return priceFuture.stream()
94 94 .map(CompletableFuture::join) //join 操作等待所有异步操作的结果
95 95 .collect(toList());
96 96 }
97 97
98 98 @Test
99 99 public void test3() {
100 100 long start = System.currentTimeMillis();
101 101 System.out.println(findPrice3("java8实战"));
102 102 long duration = System.currentTimeMillis() - start;
103 103 System.out.println("总消耗时间:" + duration + "毫秒");
104 104 }
105 105
106 106 public static List<String> findPrice3(String product){
107 107 List<Shop> shops = Arrays.asList(new Shop("sunjin.org"),
108 108 new Shop("加瓦匠"),
109 109 new Shop("京东商城"),
110 110 new Shop("天猫商城"));
111 111 return shops.stream()
112 112 .map(shop -> shop.getPrice2(product)) //获取原始报价
113 113 .map(Quote::parse) //解析报价字符串
114 114 .map(Discount::applyDiscount) //调用折扣服务应用报价折扣
115 115 .collect(toList());
116 116 }
117 117
118 118 @Test
119 119 public void test4() {
120 120 long start = System.currentTimeMillis();
121 121 System.out.println(findPrice4("java8实战"));
122 122 long duration = System.currentTimeMillis() - start;
123 123 System.out.println("总消耗时间:" + duration + "毫秒");
124 124 }
125 125
126 126 private static Executor executor = Executors.newCachedThreadPool();
127 127 public static List<String> findPrice4(String product){
128 128 List<Shop> shops = Arrays.asList(new Shop("sunjin.org"),
129 129 new Shop("加瓦匠"),
130 130 new Shop("京东商城"),
131 131 new Shop("天猫商城"));
132 132 List<CompletableFuture<String>> priceFuture = shops.stream()
133 133 .map(shop -> CompletableFuture.supplyAsync( // 异步获取价格
134 134 () -> shop.getPrice2(product), executor))
135 135 .map(future -> future.thenApply(Quote::parse)) // 获取到价格后对价格解析
136 136 .map(future -> future.thenCompose(quote -> CompletableFuture.supplyAsync( // 另一个异步任务构造异步应用报价
137 137 () -> Discount.applyDiscount(quote), executor)))
138 138 .collect(toList());
139 139 return priceFuture.stream()
140 140 .map(CompletableFuture::join) //join 操作和get操作有相同的含义,等待所有异步操作的结果。
141 141 .collect(toList());
142 142 }
143 143
144 144
145 145 @Test
146 146 public void test5() {
147 147 long start = System.currentTimeMillis();
148 148 System.out.println(findPrice5("java8实战"));
149 149 long duration = System.currentTimeMillis() - start;
150 150 System.out.println("总消耗时间:" + duration + "毫秒");
151 151 }
152 152
153 153 public static List<Double> findPrice5(String product){
154 154 List<Shop> shops = Arrays.asList(new Shop("sunjin.org"),
155 155 new Shop("加瓦匠"),
156 156 new Shop("京东商城"),
157 157 new Shop("天猫商城"));
158 158 List<CompletableFuture<Double>> priceFuture = shops.parallelStream()
159 159 .map(shop -> CompletableFuture.supplyAsync( // 异步获取价格
160 160 () -> shop.getPrice(product), executor))
161 161 .map(future -> future.thenCombine(CompletableFuture.supplyAsync( // 异步获取折扣率
162 162 () -> Discount.getRate(), executor)
163 163 , (price, rate) -> price * rate)) // 将两个异步任务的结果合并
164 164 .collect(toList());
165 165 return priceFuture.parallelStream()
166 166 .map(CompletableFuture::join) //join 操作和get操作有相同的含义,等待所有异步操作的结果。
167 167 .collect(toList());
168 168 }
169 169
170 170 }