首先说类方法 supplyAsync()
和 runAsync()
的区别:
CompletableFuture
类中提供了 supplyAsync()
和 runAsync()
两个方法来创建异步执行的任务。这两个方法的区别在于:
-
返回值类型不同:
supplyAsync()
方法接受一个Supplier
对象作为参数,该对象产生一个结果,返回一个CompletableFuture
对象,该对象的get()
方法可以获取到该结果。而runAsync()
方法接受一个Runnable
对象作为参数,该对象没有返回值,返回的CompletableFuture
对象在调用get()
方法时返回一个空值null
。 -
参数不同:
supplyAsync()
方法需要传递一个返回结果的函数式接口,而runAsync()
方法只需要传递一个没有返回值的函数式接口。
下面是一个代码示例,展示了 supplyAsync()
和 runAsync()
的区别:
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
// 产生一个结果
return "Hello";
});
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
// 没有返回值
System.out.println("World");
});
参考实例:
@Override
public Boolean insertEmailMsg(EmailSendMsgResultVO resultVO) {
CompletableFuture.runAsync(() -> {
try {
MsgRecordVO msgRecordVO = emailSendRecordAssembly.assembly(resultVO);
emailSendRecordDAO.insert(msgRecordBizMapper.vo2doEmail(msgRecordVO));
} catch (Exception e){
log.error("insertEmailMsg: {} error", JSON.toJSONString(resultVO), e);
}
}, taskExecutor);
return