import java.net.HttpURLConnection;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Java并发处理的例子
* <Description> <br>
* @author bestree007<br>
* @version 1.0<br>
* @taskId <br>
* @CreateDate 2020年6月29日 <br>
*/
public class CompletableFutureDemo {
/**
* 请求外部api,需要将多次请求的结果汇总后使用,且每次请求不能一次拉取,需要分多次拉取
* Description: <br>
* @author bestree007<br>
* @taskId <br>
* @param args <br>
*/
public static void main(String[] args) {
Executor execservice = Executors.newFixedThreadPool(10);
List<CompletableFuture<String>> tasks = new ArrayList<>();
for (int num = 0; num < 10; num++) {
final int idx = num;
CompletableFuture<String> taskFuture = CompletableFuture.supplyAsync(() -> {
// 这里直接返回了个数字,实际使用时往往是个耗时的本地或者远程调用
return String.valueOf(idx);
}, execservice);
tasks.add(taskFuture);
}
CompletableFuture<String>[] futureArray = tasks.toArray(new CompletableFuture[tasks.size()]);
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(futureArray);
try {
// 等待返回,这里等待所有任务执行完成
combinedFuture.get();
// 对结果进行汇总
List<String> combinedResult = Stream.of(futureArray).map(CompletableFuture::join)
.distinct()
.collect(Collectors.toList());
// 这里简单的打印一下
System.out.println(combinedResult);
} catch (InterruptedException | ExecutionException e) {
Thread.currentThread().interrupt();
}
}
}