package droidkit.concurrent;
import android.support.annotation.NonNull;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
/**
* @author Daniel Serdyukov
*/
public class AsyncQueue implements ExecQueue {
private static final int CORE_SIZE = Runtime.getRuntime().availableProcessors();
private static final ThreadFactory THREAD_FACTORY = new NamedThreadFactory("async #");
private final ScheduledExecutorService mAsyncExecutor;
public AsyncQueue() {
this(CORE_SIZE + 1);
}
protected AsyncQueue(int corePoolSize) {
mAsyncExecutor = Executors.newScheduledThreadPool(corePoolSize, THREAD_FACTORY);
}
public static AsyncQueue get() {
return Holder.INSTANCE;
}
@NonNull
@Override
public <V> Future<V> invoke(@NonNull Callable<V> task) {
return mAsyncExecutor.submit(task);
}
@NonNull
@Override
public Future<?> invoke(@NonNull Runnable task) {
return mAsyncExecutor.submit(task, null);
}
@NonNull
@Override
public <V> Future<V> invoke(@NonNull Callable<V> task, long delay) {
return mAsyncExecutor.schedule(task, delay, TimeUnit.MILLISECONDS);
}
@NonNull
@Override
public Future<?> invoke(@NonNull Runnable task, long delay) {
return mAsyncExecutor.schedule(task, delay, TimeUnit.MILLISECONDS);
}
@NonNull
@Override
public ExecutorService getExecutor() {
return mAsyncExecutor;
}
private static final class Holder {
public static final AsyncQueue INSTANCE = new AsyncQueue();
}
}