package tc.oc.commons.core.concurrent; import java.util.concurrent.Executor; import javax.annotation.Nullable; import tc.oc.commons.core.util.StackTrace; import tc.oc.commons.core.util.ThrowingRunnable; import tc.oc.commons.core.util.Traceables; @FunctionalInterface public interface CatchingExecutor extends Executor { void executeCatch(ThrowingRunnable<?> command, @Nullable StackTrace source); default void executeCatch(ThrowingRunnable<?> command) { executeCatch(command, Traceables.computeStackTrace(command, CatchingExecutor.class)); } default void execute(Runnable command, @Nullable StackTrace source) { executeCatch(command::run, source); } @Override default void execute(Runnable command) { execute(command, Traceables.computeStackTrace(command, CatchingExecutor.class)); } }