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 dieFutureTask
implementiert 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