So implementieren Sie PriorityBlockingQueue mit ThreadPoolExecutor und benutzerdefinierten Tasks

Ich habe viel gesucht, konnte aber keine Lösung für mein Problem finden.

Ich habe meine eigene Klasse,BaseTask, das ein @ verwendThreadPoolExecutor, um Aufgaben zu erledigen.
Wenn ich keine Priorisierung möchte (d. H. Mit einemLinkedBlockingQueue) das funktioniert einwandfrei, aber wenn ich versuche, ein @ zu verwendPriorityBlockingQueue Ich bekommeClassCastException weil derThreadPoolExecutor hüllt meine Aufgaben in einFutureTask Objekt
Dies ist offensichtlich in Ordnung, weil dieFutureTaskimplementiert nichtComparable, aber wie würde ich fortfahren, um das vorrangige Problem zu lösen?
Ich habe gelesen, dass Sie @ überschreiben könntnewTaskFor imThreadPoolExecutor, aber ich kann diese Methode anscheinend gar nicht finden ...?

Anregungen wäre sehr dankbar!

Einiger Code zur Hilfe:

In meinemBaseTask Klasse, die ich habe

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

ImBaseFutureTask class

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

    return Long.signum(diff);
}

ImBaseThreadPoolExecutor Klasse ich überschreibe die 3submit Methoden ...
Der Konstruktor in dieser Klasse wird aufgerufen, aber keiner dersubmit methods

Antworten auf die Frage(12)

Ihre Antwort auf die Frage