package net.minecraft.util.thread; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.function.Consumer; public interface TaskScheduler extends AutoCloseable { String name(); void schedule(R task); default void close() { } R wrapRunnable(Runnable runnable); default CompletableFuture scheduleWithResult(Consumer> resultConsumer) { CompletableFuture completableFuture = new CompletableFuture(); this.schedule(this.wrapRunnable(() -> resultConsumer.accept(completableFuture))); return completableFuture; } static TaskScheduler wrapExecutor(String name, Executor executor) { return new TaskScheduler() { @Override public String name() { return name; } @Override public void schedule(Runnable task) { executor.execute(task); } @Override public Runnable wrapRunnable(Runnable runnable) { return runnable; } public String toString() { return name; } }; } }