gpt4 book ai didi

java - HttpClient 在处理最大数量的请求时会阻塞?

转载 作者:行者123 更新时间:2023-12-01 15:00:07 25 4
gpt4 key购买 nike

我在整个应用程序中使用 HttpClient 单例,在任何给定时间它最多必须同时处理 3 个请求。我想在处理 3 个请求时阻止任何尝试执行请求的线程。这是到目前为止我的代码:

public class BlockingHttpClient implements HttpClient {

private static final int MAX_CONNECTIONS = 3;

private static BlockingHttpClient instance;
private HttpClient delegate;
private Semaphore semaphore;

private BlockingHttpClient() {
delegate = new DefaultHttpClient();
semaphore = new Semaphore(MAX_CONNECTIONS, true);
// Set delegate with a thread-safe connectionmanager and params etc..
}

public static synchronized BlockingHttpClient getInstance() {
if(instance == null) {
instance = new BlockingHttpClient();
}

return instance;
}

@Override
public HttpResponse execute(HttpUriRequest request) throws IOException,
ClientProtocolException {
HttpResponse response = null;

try {
semaphore.acquire();
response = delegate.execute(request);
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}

return response;
}

.... the other delegated methods look the same ...

我担心的是,这很丑陋,即如果调用线程在获取时被中断,那么返回的响应将为空。对于 Java 中的并发性,我也很陌生,这种方法还有其他问题吗?

最佳答案

为了避免返回空响应,您可以使用的一个肮脏技巧是:

    boolean responseOK;
do {
try {
semaphore.acquire();
response = delegate.execute(request);
semaphore.release();
responseOK = true;
} catch (InterruptedException e) {
e.printStackTrace();
responseOK = false;
}
} while(!responseOK);

我知道这有点脏,也许你可以在迭代之间添加一些 sleep ,以防止它变成主动等待,但这是确保请求最终被执行的一种方法(如果其他请求完成,那就是...)。

希望对你有帮助!

关于java - HttpClient 在处理最大数量的请求时会阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778622/

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