アプリケーション全体で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 ...
私が心配しているのは、これが醜いことです。つまり、取得中に呼び出し元のスレッドが中断された場合、返される応答はnullになります。Javaでの並行性に関しても、私はかなり環境に配慮していますが、このアプローチに他に問題はありますか?