CompletableFuture
提供以下方法,可以主动设置任务结果。
boolean complete(T value)
boolean completeExceptionally(Throwable ex)
第一个方法,主动设置 CompletableFuture
任务执行结果,若返回 true
,表示设置成功。如果返回 false
,设置失败,这是因为任务已经执行结束,已经有了执行结果。
示例代码如下:
// 执行异步任务
CompletableFuture cf = CompletableFuture.supplyAsync(() -> {
System.out.println("cf 任务执行开始");
sleep(10, TimeUnit.SECONDS);
System.out.println("cf 任务执行结束");
return "楼下小黑哥";
});
//
Executors.newSingleThreadScheduledExecutor().execute(() -> {
sleep(5, TimeUnit.SECONDS);
System.out.println("主动设置 cf 任务结果");
// 设置任务结果,由于 cf 任务未执行结束,结果返回 true
cf.complete("程序通事");
});
// 由于 cf 未执行结束,将会被阻塞。5 秒后,另外一个线程主动设置任务结果
System.out.println("get:" + cf.get());
// 等待 cf 任务执行结束
sleep(10, TimeUnit.SECONDS);
// 由于已经设置任务结果,cf 执行结束任务结果将会被抛弃
System.out.println("get:" + cf.get());
/***
* cf 任务执行开始
* 主动设置 cf 任务结果
* get:程序通事
* cf 任务执行结束
* get:程序通事
*/
这里需要注意一点,一旦 complete
设置成功,CompletableFuture
返回结果就不会被更改,即使后续 CompletableFuture
任务执行结束。
第二个方法,给 CompletableFuture
设置异常对象。若设置成功,如果调用 get
等方法获取结果,将会抛错。
示例代码如下:
// 执行异步任务
CompletableFuture cf = CompletableFuture.supplyAsync(() -> {
System.out.println("cf 任务执行开始");
sleep(10, TimeUnit.SECONDS);
System.out.println("cf 任务执行结束");
return "楼下小黑哥";
});
//
Executors.newSingleThreadScheduledExecutor().execute(() -> {
sleep(5, TimeUnit.SECONDS);
System.out.println("主动设置 cf 异常");
// 设置任务结果,由于 cf 任务未执行结束,结果返回 true
cf.completeExceptionally(new RuntimeException("啊,挂了"));
});
// 由于 cf 未执行结束,前 5 秒将会被阻塞。后续程序抛出异常,结束
System.out.println("get:" + cf.get());
/***
* cf 任务执行开始
* 主动设置 cf 异常
* java.util.concurrent.ExecutionException: java.lang.RuntimeException: 啊,挂了
* ......
*/