package org.threadly.concurrent; import java.util.concurrent.Callable; import org.threadly.util.ArgumentVerifier; /** * Converts a {@link Runnable} with a result into a {@link Callable}. This is similar to * {@link java.util.concurrent.Executors#callable(Runnable, Object)}, except this implementation * also implements the {@link RunnableContainer} interface. * * @since 4.3.0 * @param <T> Type of result returned */ public class RunnableCallableAdapter<T> implements Callable<T>, RunnableContainer { protected final Runnable runnable; protected final T result; /** * Constructs a new adapter with a provided runnable to execute. The returned result from this * callable will be {@code null}. * * @param runnable Runnable to be invoked when this adapter is ran */ public RunnableCallableAdapter(Runnable runnable) { this(runnable, null); } /** * Constructs a new adapter with a provided runnable to execute, and an optional result. * * @param runnable Runnable to be invoked when this adapter is ran * @param result Result to return from runnable or {@code null} */ public RunnableCallableAdapter(Runnable runnable, T result) { ArgumentVerifier.assertNotNull(runnable, "runnable"); this.runnable = runnable; this.result = result; } @Override public Runnable getContainedRunnable() { return runnable; } @Override public T call() { runnable.run(); return result; } }