package ua.kpi.ecampus.util;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.schedulers.Schedulers;
/**
* Global Executor for background tasks
*
* Created by Administrator on 21.03.2016.
*/
public class BackgroundExecutor {
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE = 1;
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<>(128);
/**
* An {@link Executor} that can be used to execute tasks in parallel.
*/
private static final Executor THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue);
public static Executor getSafeBackgroundExecutor() {
return THREAD_POOL_EXECUTOR;
}
public static <T> Observable<T> createSafeBackgroundObservable(Observable.OnSubscribe<T> f) {
return Observable.create(f).subscribeOn(Schedulers.from(THREAD_POOL_EXECUTOR));
}
}