Comment mettre en œuvre PriorityBlockingQueue avec ThreadPoolExecutor et des tâches personnalisées

J'ai beaucoup cherché mais impossible de trouver une solutuion à mon problème.

J'ai ma propre classe, BaseTask, qui utilise un ThreadPoolExecutor pour gérer les tâches.

Si je ne veux pas d'ordre de priorité (c'est à dire à l'aide d'un LinkedBlockingQueue) cela fonctionne bien, mais lorsque j'essaie d'utiliser un PriorityBlockingQueue - je obtenir ClassCastException parce que le ThreadPoolExecutor enroule mes Tâches dans un FutureTask objet.

C'est évidemment OK parce que le FutureTaskne pas mettre en œuvre Comparable, mais comment m'y prendre pour résoudre le problème de priorité?

J'ai lu que vous pourriez remplacer newTaskFor dans ThreadPoolExecutor, mais je n'arrive pas a trouver cette méthode à tous...?

Toutes les suggestions seront très appréciés!

Un peu de code pour vous aider:

Dans mon BaseTask classe j'ai

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);
}

Dans BaseFutureTask classe

@Override
public int compareTo(BaseFutureTask another) {
    long diff = this.priority - another.priority;

    return Long.signum(diff);
}

Dans BaseThreadPoolExecutor classe je remplace les 3 submit méthodes...

Le constructeur de cette classe est appelée, mais aucun des submit méthodes

InformationsquelleAutor greve | 2010-08-23