我們需要要組成一個Person實體一罩,由3個部分head杨幼,body,foot組成聂渊。
組成實體的每個組件差购,每一步都沒有依賴,可以同時獲取一同組裝汉嗽。
首先我們定義出Person實體和她都組成部分
inner class Head
inner class Body
inner class Foot
class Person {
var head: Head? = null
var body: Body? = null
var foot: Foot? = null
fun set(v: Any?) {
when (v) {
is Head -> this.head = v
is Body -> this.body = v
is Foot -> this.foot = v
else -> println("not support type")
}
}
override fun toString(): String {
return "Person(head=$head, body=$body, foot=$foot)"
}
}
然后我們開始異步拼裝實體Person
//定義一個業(yè)務線程池
val executor = ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, LinkedBlockingQueue())
//異步獲取Head
fun getHead(): CompletableFuture<Result<out Any>> {
return CompletableFuture.supplyAsync({ Result.of(Head()) }, executor::execute)
}
//異步獲取Body
fun getBody(): CompletableFuture<Result<out Any>> {
return CompletableFuture.supplyAsync({ Result.of(Body()) }, executor::execute)
}
//異步獲取Foot
fun getFoot(): CompletableFuture<Result<out Any>> {
return CompletableFuture.supplyAsync({ Result.of(Foot()) }, executor::execute)
}
val futures = listOf(getHead(), getBody(), getFoot())
//獲取3個組件完成欲逃,初始化一個Person對象,將組件拼接上去
val result = sequence(futures).get().fold(Result.of(Person())) { p, v -> p.model?.set(v.model);p }
println(result.model)
做一個工具方法獲取全部的結果
fun <T> sequence(futures: List<CompletableFuture<T>>): CompletableFuture<List<T>> {
return CompletableFuture.allOf(*futures.toTypedArray()).thenApply { futures.map { it.join() } }
}