import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
List<String> taskList = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
// 全流式处理转换成CompletableFuture[]+组装成一个无返回值CompletableFuture,join等待执行完毕。返回结果whenComplete获取
ExecutorService executorService = Executors.newFixedThreadPool(10);
CompletableFuture[] cfs = taskList.stream()
.map(integer -> CompletableFuture.supplyAsync(() -> calc(integer), executorService)
.whenComplete((s, e) -> {
System.out.println("任务"+s+"完成!result="+s+",异常 e="+e+","+new Date());
list.add(s);
})
).toArray(CompletableFuture[]::new);
// 封装后无返回值,必须自己whenComplete()获取
CompletableFuture.allOf(cfs).join();
System.out.println("finish");
}
public static String calc(String i) {
try {
if (i .equals("1")) {
Thread.sleep(3000);//任务1耗时3秒
} else if (i.equals("5")) {
Thread.sleep(5000);//任务5耗时5秒
} else {
Thread.sleep(1000);//其它任务耗时1秒
}
System.out.println("task线程:" + Thread.currentThread().getName()
+ "任务i=" + i + ",完成!+" + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
return i;
}
}
CompletableFuture异步调用返回结果
最新推荐文章于 2024-03-11 23:04:51 发布