直接上代码,下面的代码包括了几个功能
这样带来的好处时,避免任务调度不过来的时候,卡在队列中,无限等待。
object FutureUtils {
private val log: Logger = LoggerFactory.getLogger(FutureUtils::class.java)
/**
* 执行带超时的异步任务,如果执行失败或者遇到异常,都会返回默认值
* @param defaultValue U 发生异常或者超时时的默认值
* @param timeout 超时值
* @param unit 超时单位
* @param taskName 任务名称
* @param executor 线程池
* @param supplier Function0<U>
*/
@JvmStatic
fun <U> supplyAsync(
defaultValue: U,
timeout: Long,
unit: TimeUnit,
taskName:String,
executor: Executor,
supplier: () -> U
): CompletableFuture<U> {
return CompletableFuture.supplyAsync(supplier, executor)
.orTimeout(timeout, unit)
.handle { res, ex ->
if (ex == null)
return@handle res
else {
if (ex is TimeoutException) {
log.error("【CompletableFuture】任务$taskName 超过指定时间:$timeout,返回默认值:$defaultValue")
} else {
log.error("【CompletableFuture】任务$taskName 发生异常,返回默认值:$defaultValue,异常堆栈如下所示", ex)
}
return@handle defaultValue
}
}
}
}
备注几点
orTimeout
时Java9之后才可以用的,是不是多了一个升级到JDK11的理由?