Cómo implementar PriorityBlockingQueue con ThreadPoolExecutor y tareas personalizadas
He buscado mucho pero no he podido encontrar una solución a mi problema.
Tengo mi propia claseBaseTask
, que usa unThreadPoolExecutor
para manejar tareas.
Si no quiero priorizar (es decir, usar unLinkedBlockingQueue
) esto funciona bien, pero cuando trato de usar unPriorityBlockingQueue
yo obtengoClassCastException
porque elThreadPoolExecutor
envuelve mis tareas en unFutureTask
objeto.
Esto obviamente está bien porque elFutureTask
no implementaComparable
, pero ¿cómo resolvería el problema prioritario?
He leído que podrías anularnewTaskFor
enThreadPoolExecutor
, pero parece que no puedo encontrar este método en absoluto ...?
¡Cualquier sugerencia sería muy apreciada!
Algún código para ayudar:
En miBaseTask
clase que tengo
private static final BlockingQueue<Runnable> sWorkQueue = new PriorityBlockingQueue<Runnable>();
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};
private static final BaseThreadPoolExecutor sExecutor = new BaseThreadPoolExecutor(
1, Integer.MAX_VALUE, 10, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);
private final BaseFutureTask<Result> mFuture;
public BaseTask(int priority) {
mFuture = new BaseFutureTask<Result>(mWorker, priority);
}
public final BaseTask<Params, Progress, Result> execute(Params... params) {
/* Some unimportant code here */
sExecutor.execute(mFuture);
}
EnBaseFutureTask
clase
@Override
public int compareTo(BaseFutureTask another) {
long diff = this.priority - another.priority;
return Long.signum(diff);
}
EnBaseThreadPoolExecutor
clase i anular el 3submit
métodos ...
Se llama al constructor de esta clase, pero ninguno de lossubmit
métodos