两个期货完成后如何释放信号量?

How can I release the semaphore when two futures are completed?

我有一个 Springboot java 应用程序,它与 cassandra 数据库通信并使用 google 番石榴库。

目前我遇到了一个问题。我在代码中有一个信号量对象。

在我的方法中,我必须使用两个对象(mapper 和 parameterisedListMsisdnMapper)模拟地执行两个写入查询。

使用映射器触发每个查询 returns ListenableFuture future 和 ListenableFuture future1 对象。我怎样才能重写下面的代码,以便在 future 和 future1 对象完成后释放信号量。

public class ParameterisedListItemRepository {
        
        public ParameterisedListItemRepository() {
         this.executor = MoreExecutors.directExecutor();
         this.semaphore = new Semaphore(getNumberOfRequests(session));
        }
       
       public void saveAsync(ParameterisedListItem parameterisedListItem) {
           try {
             semaphore.acquire();
             ListenableFuture<Void> future = mapper.saveAsync(parameterisedListItem);
             ListenableFuture<Void> future1 = parameterisedListMsisdnMapper.saveAsync( mapParameterisedList(parameterisedListItem));
             future.addListener(() -> semaphore.release(), executor);
            } catch (InterruptedException e) {
                        throw new RuntimeException("Semaphore was interrupted.");
            }
       }
    
    }

感谢任何帮助

我用过 Futures.whenAllSucceed 并且有效

  public void saveAsync(ParameterisedListItem parameterisedListItem) {
        if (parameterisedListItem.getId() == null) {
            parameterisedListItem.setId(UUID.randomUUID());
        }
        Set<ConstraintViolation<ParameterisedListItem>> violations = validator.validate(parameterisedListItem);
        if (violations != null && !violations.isEmpty()) {
            throw new ConstraintViolationException(violations);
        }

        Callable releasePermit = () -> { semaphore.release();
            return null;
        };
        
        try {
            semaphore.acquire();
            ListenableFuture<Void> future1 = mapper.saveAsync(parameterisedListItem);
            ListenableFuture<Void> future2 = parameterisedListMsisdnMapper.saveAsync( mapParameterisedList(parameterisedListItem));
            Futures.whenAllSucceed(future1, future2).call(releasePermit, executor);

        } catch (InterruptedException e) {
            //FIXME handle exception in better way
            throw new RuntimeException("Semaphore was interrupted.");
        }
    }