ブロッキング キューにキューイングされているタスクのリストを非同期的に実装しようとしています。単一のスレッドによってバッチごとに消費され、各タスクの完了を報告する 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();
});
}}
この種のユースケースを実装するためのより良い (よりクリーンな) 方法はありますか?