尝试异步实现排队到阻塞队列的任务列表。一个 BlockingQueue 被单个线程批量消耗并报告每个任务的完成。
例如。1) Web 请求生成一个List<Task>
排队到 BlockingQueue 的队列,该队列由单线程消费者批量消费。2) 阻止 Web 请求,直到该请求的任务完成。3) 当单线程消费者完成该请求的所有任务时通知 webrequest。
我想有一个Map.Entry<CompletableFuture<Task>,Task>
被推送到队列并通知对应于正在处理的任务的一个complete()
。CompletableFuture
webrequest 基本上等待所有期货完成。
class BlockingQueue<Pair> {
run(){
List<Pair> batchTasks = takeBatch(n);
compute(batchTasks)
}
compute(List tasks){
... batch operation
tasks.forEach -> mark complete on the completableFuture
}
}
class WebRequest {
get(){
....
List<Pair<CompletableFuture<Task>, Task>> taskMap = new ArrayList<>(taskList.size());
taskList.stream().forEach(val -> taskMap.add(new Pair<>(new CompletableFuture<Task>(),val)));
taskMap.forEach((pair) -> {
pair.left.join();
});
}}
有没有更好的(更清洁的)方法来实现这种用例?