CompletableFuture 通用异步编程
1. 多线程异步执行,带有返回值方法,避免使用get获取结果集会阻塞线程.
2. 具体执行业务逻辑方法
() -> { System.out.println(Thread.currentThread().getName() + "------come in");
int result = ThreadLocalRandom.current().nextInt(10);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("---计算完成等待一秒钟输出结果");
return result;
3. 正常执行结束
if (e == null) {
System.out.println("输出完成" + v);
}
4. 异常执行结束
e.printStackTrace();
System.out.println("执行异常");
return null;
5. CompletableFuture好处
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
try {
CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + "------come in");
int result = ThreadLocalRandom.current().nextInt(10);
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println("---计算完成等待一秒钟输出结果");
return result;
},executorService).whenComplete((v, e) -> {//当执行结束
if (e == null) {System.out.println("输出完成" + v);} }).exceptionally(e -> {e.printStackTrace();System.out.println("执行异常");
return null;
});
System.out.println("主线程执行其他任务");
//主线程不要立刻结束,否则CompletableFuture默认使用的线程池会立刻关闭,暂停三秒钟结束
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
}
简化执行任务闭并返回数据
ExecutorService executorService = Executors.newFixedThreadPool(3);
//调用异步有返回值方法
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName());
return "hello word";
},executorService);
System.out.println(completableFuture.get());
executorService.shutdown();

image.png