私はたくさん検索しましたが、私の問題の解決策を見つけることができませんでした。
BaseTask
を使用しThreadPoolExecutor
てタスクを処理する独自のクラスがあります。タスクの優先順位付けが必要ですが、タスクをオブジェクトにラップするため、 PriorityBlockingQueue
Iを使用しようとすると取得します。ClassCastException
ThreadPoolExecutor
FutureTask
FutureTask
は実装されていないため、これは明らかに理にかなっていComparable
ますが、優先度の問題を解決するにはどうすればよいでしょうか。newTaskFor()
でオーバーライドできることを読みましたがThreadPoolExecutor
、このメソッドがまったく見つからないようです...?
任意の提案をいただければ幸いです!
役立つコード:
私のBaseTask
クラスでは
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);
}
BaseFutureTask
クラスで
@Override
public int compareTo(BaseFutureTask another) {
long diff = this.priority - another.priority;
return Long.signum(diff);
}
BaseThreadPoolExecutor
クラスiで3つのメソッドをオーバーライドします...このsubmit
クラスのコンストラクターが呼び出されますが、どのsubmit
メソッドも呼び出されません