Java многопоточность - потоки не вызываются до семафора - PullRequest
2 голосов
/ 31 марта 2020

Я пытаюсь создать что-то похожее на это: у меня есть класс, который открывает HTTP-соединения: ConnectionContext. Этот класс имеет семафор с именем connections, который позволяет открыть maxConnections. Это выглядит примерно так:

public ConnectionContext(..., int maxConnections, ...) {
    ...
    this.connections = new Semaphore(maxConnections);

    public void acquireOne() throws InterruptedException {
        connections.acquire(1);
    }

    public void acquireAllAndClose() throws Exception {
        this.connections.acquire(maxConnections);
        closeHTTPConnection();
    }

    public void releaseOne() {
        this.connections.rlease(1);
    }
}

У меня есть другой класс с именем HTTPConnector, который содержит это ConnectionContext:

public class HTTPConnector {
    protected final ConnectionContext connectionContext;

    public HttpWriter(..., int maxConnections, ...) {
        this.connectionContext = new ConnectionContext(..., maxConnections, ...);
        ...
    }

    public void execute() {
        ...
        connectionContext.acquireOne();
        connectionContext.process();
        ...
        connectionContext.releaseOne();
    }

    protected void close() throws Exception {
        connectionContext.acquireAllAndClose();
    }
}

Так что это более или менее структура моего программа и теперь проблема: если я открываю несколько соединений с многопоточностью, я вызываю один раз HTTPConnector и запускаю HTTPConnector.execute() несколько раз, и каждый раз получаю разрешение от семафора, и после того, как все задания выполнены, я вызывая HTTPConnector.close(), чтобы закрыть соединение.

, но иногда HTTPConnector.close() вызывается до того, как я вызову все HTTPConnector.execute(), и затем соединение закрывается до того, как все задания будут выполнены.

мой вопрос: как сделать так, чтобы HTTPConnector.close() вызывали только после того, как в пути нет HTTPConnector.execute()?

...