gpt4 book ai didi

java - Java中如何保证同一时间只有一个请求

转载 作者:行者123 更新时间:2023-11-29 08:29:05 25 4
gpt4 key购买 nike

我想实现如下调用:

public Response getContent() throws MyException

此方法在内部调用 Web 服务,但我只想同时向 Web 服务发出一个请求。也就是说:当第一个请求到来时,它会转到 Web 服务。如果同时有另一个请求到达,它将等待第一个请求的结果。第一个请求返回(或抛出异常)后,所有待处理的请求也返回(或抛出异常)。从这一点开始,如果另一个请求到来,它会再次以相同的条件转到 Web 服务(同时仅调用一个 Web 服务)

在 Java/Android 中实现此功能的最佳方法是什么?

谢谢

最佳答案

这是一个带有 CompletableFuture 的解决方案,它始终阻止等待新结果。如果您调用 get() 并且已有结果,则会触发新的提取并阻塞。如果提取已经在进行中,它将加入等待该结果的其他线程。

import java.util.concurrent.CompletableFuture
import java.util.concurrent.atomic.AtomicReference

class OneAtATime<out T> {
private val pending = AtomicReference(CompletableFuture<T>())
init {
startFetching(pending.get())
}

fun get(): T {
val current = pending.get()
if (!current.isDone) {
return current.get()
}
val next = CompletableFuture<T>()
return if (pending.compareAndSet(current, next)) {
startFetching(next)
next.get()
} else {
pending.get().get()
}
}

private fun startFetching(future: CompletableFuture<T>) {
TODO("Implementation must call future.complete(newContent)")
}
}

关于java - Java中如何保证同一时间只有一个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49793091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com