0

アプリケーション全体で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での並行性に関しても、私はかなり環境に配慮していますが、このアプローチに他に問題はありますか?

4

1 に答える 1

1

null 応答を返さないようにするために、次のような汚いトリックを使用できます。

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

私はちょっと汚いことを知っています、そして多分あなたはそれがアクティブな待機に変わるのを防ぐために反復の間にいくらかの睡眠を追加することができますが、それはリクエストが最終的に実行されることを確実にする方法です(他のリクエストが終了した場合、つまり... )。

それが役に立てば幸い!

于 2013-01-15T18:19:42.303 に答える