package org.warp.commonutils.concurrency.executor; import java.util.concurrent.Callable; import org.jetbrains.annotations.NotNull; public final class PermitReleasingCallableDecorator extends CallableDecorator { @NotNull private final QueueSizeUpdater queueSizeUpdater; PermitReleasingCallableDecorator(@NotNull final Callable task, @NotNull final QueueSizeUpdater queueSizeUpdater) { super(task); this.queueSizeUpdater = queueSizeUpdater; } @Override public T call() throws Exception { try { queueSizeUpdater.update(true); } finally { try { return super.call(); } finally { queueSizeUpdater.update(false); } } } @Override public final String toString() { return String.format("%s[delegate='%s']", getClass().getSimpleName(), super.toString()); } }