Como implementar PriorityBlockingQueue com ThreadPoolExecutor e tarefas personalizadas
Pesquisei bastante, mas não consegui encontrar uma solução para o meu problema.
Eu tenho minha própria turmaBaseTask
, que usa umThreadPoolExecutor
para lidar com tarefas.
Se eu não quiser priorizar (ou seja, usar umLinkedBlockingQueue
) isso funciona muito bem, mas quando tento usar umPriorityBlockingQueue
eu receboClassCastException
porque oThreadPoolExecutor
envolve minhas tarefas em umFutureTask
objeto.
Obviamente, isso é bom porque oFutureTask
não implementaComparable
, mas como resolveria o problema de prioridade?
Eu li que você poderia substituirnewTaskFor
noThreadPoolExecutor
, mas não consigo encontrar esse método ...?
Qualquer sugestão será muito bem-vinda!
Algum código para ajudar:
No meuBaseTask
classe que eu tenho
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);
}
NoBaseFutureTask
classe
@Override
public int compareTo(BaseFutureTask another) {
long diff = this.priority - another.priority;
return Long.signum(diff);
}
NoBaseThreadPoolExecutor
classe eu substituo os 3submit
métodos...
O construtor nesta classe é chamado, mas nenhum dossubmit
métodos