Я пытаюсь создать что-то похожее на это: у меня есть класс, который открывает 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()
?