2

尝试异步实现排队到阻塞队列的任务列表。一个 BlockingQueue 被单个线程批量消耗并报告每个任务的完成。

例如。1) Web 请求生成一个List<Task>排队到 BlockingQueue 的队列,该队列由单线程消费者批量消费。2) 阻止 Web 请求,直到该请求的任务完成。3) 当单线程消费者完成该请求的所有任务时通知 webrequest。

我想有一个Map.Entry<CompletableFuture<Task>,Task>被推送到队列并通知对应于正在处理的任务的一个complete()CompletableFuturewebrequest 基本上等待所有期货完成。

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();
    });

}}

有没有更好的(更清洁的)方法来实现这种用例?

4

0 回答 0